Moved the project to Gradle. Still missing:

- SuppressFBWarnings is not commented.
- Versions might still be mixed up here and there (i.e. "version" and "mavenVersion")

OSGI differences:

- OSGI plugin adds "Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))""
- "Export-Package" has a lot less "uses" per package.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a40850e..d97fbf8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -29,46 +29,35 @@
 
 jobs:
   build:
-    runs-on: ubuntu-latest
-
+    strategy:
+        matrix:
+            os: [windows-latest, ubuntu-latest]
+    runs-on: ${{ matrix.os }}
+    concurrency: main_tests_${{ github.ref }}
     steps:
-      - name: Checkout
-        uses: actions/checkout@v4
-
+      - name: Welcome Message
+        run: 'echo "Started with parameters: ${{ matrix.os }} because ${{ github.event_name }} on ${{ github.ref }}"'
+      - uses: actions/checkout@v4
       - name: Set up JDK 8
         uses: actions/setup-java@v3
         with:
           java-version: 8
           distribution: temurin
-
       - name: Set up JDK 16
         uses: actions/setup-java@v3
         with:
           java-version: 16
           distribution: zulu
+      - name: Validate Gradle wrapper
+        uses: gradle/wrapper-validation-action@v1.1.0
+      - name: Run Build
+        id: build_step
+        run: './gradlew --continue clean build -PsignPublication=false'
+      - name: Upload Failed Report
+        uses: actions/upload-artifact@v2.3.1
+        if: failure() && steps.build_step.outcome == 'failure'
+        with:
+          name: test-reports-${{ matrix.os }}
+          path: build/reports/**
+          retention-days: 30
 
-      - name: Prepare build.properties
-        shell: bash
-        run: >-
-          echo "boot.classpath.j2se1.8=${JAVA_HOME_8_X64}/jre/lib/rt.jar" >> build.properties;
-          echo "mvnCommand=$(which mvn)" >> build.properties;
-          echo "gpgCommand=$(which gpg)" >> build.properties;
-
-      - name: Create a gpg key for signing
-        shell: bash
-        run: >-
-          gpg --quick-gen-key --batch --passphrase '' github-build@apache.invalid;
-          echo "batch" >> "/home/runner/.gnupg/gpg.conf";
-          echo "pinentry-mode=loopback" >> "/home/runner/.gnupg/gpg.conf";
-
-      - name: Prepare ant with ivy
-        shell: bash
-        run: ant download-ivy
-
-      - name: Build with Ant and ivy
-        shell: bash
-        run: ant ci -Dci=true
-
-      - name: RAT check
-        shell: bash
-        run: ant rat
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..3126172
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,883 @@
+/*
+ * 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.
+ */
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.FileVisitResult
+import java.nio.file.Files
+import java.nio.file.SimpleFileVisitor
+import java.nio.file.attribute.BasicFileAttributes
+import java.time.Instant
+import java.time.ZoneOffset
+import java.time.format.DateTimeFormatter
+import java.util.Properties
+import java.util.TreeSet
+import java.util.stream.Collectors
+
+buildscript {
+    dependencies {
+        classpath("org.apache.freemarker.docgen:freemarker-docgen-core:0.0.2-SNAPSHOT")
+    }
+}
+
+plugins {
+    `java-library`
+    `maven-publish`
+    signing
+    id("biz.aQute.bnd.builder") version "6.1.0"
+    id("org.nosphere.apache.rat") version "0.7.0"
+}
+
+group = "org.freemarker"
+
+val buildTimeStamp = Instant.now()
+val buildTimeStampUtc = buildTimeStamp.atOffset(ZoneOffset.UTC)
+val versionFileTokens = mapOf(
+        "timestampNice" to buildTimeStampUtc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")),
+        "timestampInVersion" to buildTimeStampUtc.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'"))
+)
+val resourceTemplatesDir = file("freemarker-core/src/main/resource-templates")
+val versionPropertiesTemplate = Properties()
+Files.newBufferedReader(resourceTemplatesDir.toPath().resolve("freemarker").resolve("version.properties"), StandardCharsets.ISO_8859_1).use {
+    versionPropertiesTemplate.load(it)
+}
+val versionProperties = HashMap<String, String>()
+versionPropertiesTemplate.forEach { (key, value) ->
+    var updatedValue = value.toString()
+    for (token in versionFileTokens) {
+        updatedValue = updatedValue.replace("@${token.key}@", token.value)
+    }
+    versionProperties[key.toString()] = updatedValue.trim()
+}
+version = versionProperties["mavenVersion"]!!
+val displayVersion = versionProperties["version"]!!
+
+val freemarkerCompilerVersionOverrideRef = providers.gradleProperty("freemarkerCompilerVersionOverride")
+val defaultJavaVersion = freemarkerCompilerVersionOverrideRef
+    .orElse(providers.gradleProperty("freemarkerDefaultJavaVersion"))
+    .getOrElse("8")
+val testJavaVersion = providers.gradleProperty("freeMarkerTestJavaVersion")
+    .getOrElse("16")
+val testRunnerJavaVersion = providers.gradleProperty("freeMarkerTestRunnerJavaVersion")
+    .getOrElse(testJavaVersion)
+val javadocJavaVersion = providers.gradleProperty("freeMarkerJavadocJavaVersion")
+    .getOrElse(defaultJavaVersion)
+val doSignPackages = providers.gradleProperty("signPublication").map { it.toBoolean() }.orElse(true)
+
+java {
+    withSourcesJar()
+    withJavadocJar()
+
+    toolchain {
+        languageVersion.set(JavaLanguageVersion.of(defaultJavaVersion))
+    }
+}
+
+tasks.withType<JavaCompile>().configureEach {
+    options.encoding = "UTF-8"
+}
+
+data class JavaccReplacePattern(val relPath: String, val pattern: String, val replacement: String) : java.io.Serializable
+
+open class CompileJavacc @Inject constructor(
+    private val fs: FileSystemOperations,
+    private val exec: ExecOperations,
+    layout: ProjectLayout,
+    objects: ObjectFactory
+) : DefaultTask() {
+
+    @InputDirectory
+    val sourceDirectory: DirectoryProperty
+
+    @OutputDirectory
+    val destinationDirectory: DirectoryProperty
+
+    @InputFiles
+    var classpath: FileCollection
+
+    @Input
+    val fileNameOverrides: SetProperty<String>
+
+    @Input
+    val replacePatterns: SetProperty<JavaccReplacePattern>
+
+    init {
+        this.sourceDirectory = objects.directoryProperty().value(layout.projectDirectory.dir("src/main/javacc"))
+        this.destinationDirectory = objects.directoryProperty().value(layout.buildDirectory.dir("generated/javacc-tmp"))
+        this.classpath = objects.fileCollection()
+        this.fileNameOverrides = objects.setProperty()
+        this.replacePatterns = objects.setProperty()
+    }
+
+    @TaskAction
+    fun compileFiles() {
+        fs.delete { delete(destinationDirectory) }
+
+        val destRoot = destinationDirectory.get().asFile
+        val javaccClasspath = classpath
+
+        sourceDirectory.asFileTree.visit(object : EmptyFileVisitor() {
+            override fun visitFile(fileDetails: FileVisitDetails) {
+                val outputDir = fileDetails.relativePath.parent.getFile(destRoot)
+                Files.createDirectories(outputDir.toPath())
+
+                val execResult = exec.javaexec {
+                    classpath = javaccClasspath
+                    mainClass.set("org.javacc.parser.Main")
+                    args = listOf(
+                        "-OUTPUT_DIRECTORY=$outputDir",
+                        fileDetails.file.toString()
+                    )
+                    isIgnoreExitValue = true
+                }
+
+                val exitCode = execResult.exitValue
+                if (exitCode != 0) {
+                    throw IllegalStateException("Javacc failed with error code: $exitCode")
+                }
+            }
+        })
+
+        val fileNameOverridesSnapshot = fileNameOverrides.get()
+        val deletedFileNames = HashSet<String>()
+
+        Files.walkFileTree(destRoot.toPath(), object : SimpleFileVisitor<java.nio.file.Path>() {
+            override fun visitFile(file: java.nio.file.Path, attrs: BasicFileAttributes): FileVisitResult {
+                val fileName = file.fileName.toString()
+                if (fileNameOverridesSnapshot.contains(fileName)) {
+                    deletedFileNames.add(fileName)
+                    Files.delete(file)
+                }
+                return FileVisitResult.CONTINUE
+            }
+        })
+
+        val unusedFileNames = TreeSet(fileNameOverridesSnapshot)
+        unusedFileNames.removeAll(deletedFileNames)
+        if (unusedFileNames.isNotEmpty()) {
+            logger.warn("Javacc did not generate the following files, even though they are marked as overriden: ${unusedFileNames}")
+        }
+
+        replacePatterns.get().groupBy { it.relPath }.forEach { (relPath, patternDefs) ->
+            val file = destRoot.toPath().resolve(relPath.replace("/", File.separator))
+
+            val encoding = StandardCharsets.ISO_8859_1
+            val origContent = String(Files.readAllBytes(file), encoding)
+            var adjContent = origContent
+            for (patternDef in patternDefs) {
+                val prevContent = adjContent
+                adjContent = adjContent.replace(patternDef.pattern, patternDef.replacement)
+                if (prevContent == adjContent) {
+                    logger.warn("$file was not modified, because it does not contain the requested token: '${patternDef.pattern}'")
+                }
+            }
+
+            if (origContent != adjContent) {
+                Files.write(file, adjContent.toByteArray(encoding))
+            }
+        }
+    }
+}
+
+val compileJavacc = tasks.register<CompileJavacc>("compileJavacc") {
+    sourceDirectory.set(file("freemarker-core/src/main/javacc"))
+    destinationDirectory.set(buildDir.toPath().resolve("generated").resolve("javacc").toFile())
+    classpath = configurations.detachedConfiguration(dependencies.create("net.java.dev.javacc:javacc:7.0.12"))
+    fileNameOverrides.addAll(
+        "ParseException.java",
+        "TokenMgrError.java"
+    )
+
+    val basePath = "freemarker/core"
+    replacePatterns.addAll(
+        JavaccReplacePattern(
+            "${basePath}/FMParser.java",
+            "enum",
+            "ENUM"
+        ),
+        JavaccReplacePattern(
+            "${basePath}/FMParserConstants.java",
+            "public interface FMParserConstants",
+            "interface FMParserConstants"
+        ),
+        JavaccReplacePattern(
+            "${basePath}/Token.java",
+            "public class Token",
+            "class Token"
+        ),
+        // FIXME: This does nothing at the moment.
+        JavaccReplacePattern(
+            "${basePath}/SimpleCharStream.java",
+            "public final class SimpleCharStream",
+            "final class SimpleCharStream"
+        )
+    )
+}
+
+fun <T> concatLists(vararg lists: List<T>): List<T> {
+    val concatenated = ArrayList<T>()
+    for (list in lists) {
+        concatenated.addAll(list)
+    }
+    return concatenated
+}
+
+val allSourceSetNames = ArrayList<String>()
+
+fun configureSourceSet(sourceSetName: String, defaultCompilerVersionStr: String) {
+    allSourceSetNames.add(sourceSetName)
+
+    val compilerVersion = freemarkerCompilerVersionOverrideRef
+        .orElse(providers.gradleProperty("java${defaultCompilerVersionStr}CompilerOverride"))
+        .getOrElse(defaultCompilerVersionStr)
+        .let { JavaLanguageVersion.of(it) }
+
+    val baseDirName = if (sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME) "core" else sourceSetName
+
+    val sourceSet = sourceSets.maybeCreate(sourceSetName)
+    sourceSet.java.setSrcDirs(listOf("freemarker-${baseDirName}/src/main/java"))
+    sourceSet.resources.setSrcDirs(listOf("freemarker-${baseDirName}/src/main/resources"))
+
+    val mainSourceSet = sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get()
+
+    if (sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME) {
+        sourceSet.java.srcDir(compileJavacc)
+    } else {
+        tasks.named<Jar>(mainSourceSet.sourcesJarTaskName) {
+            from(sourceSet.allSource)
+        }
+
+        val compileOnlyConfigName = "${sourceSetName}${JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME.capitalize()}"
+
+        configurations.getByName(compileOnlyConfigName) {
+            extendsFrom(configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).get())
+        }
+
+        tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
+            from(sourceSet.output)
+        }
+
+        tasks.named<Javadoc>(JavaPlugin.JAVADOC_TASK_NAME) {
+            source(sourceSet.java)
+        }
+
+        dependencies {
+            add(compileOnlyConfigName, mainSourceSet.output)
+            testImplementation(sourceSet.output)
+        }
+    }
+
+    if (compilerVersion != java.toolchain.languageVersion.get()) {
+        tasks.named<JavaCompile>(sourceSet.compileJavaTaskName) {
+            javaCompiler.set(javaToolchains.compilerFor {
+                languageVersion.set(compilerVersion)
+            })
+        }
+    }
+}
+
+configureSourceSet(SourceSet.MAIN_SOURCE_SET_NAME, "8")
+configureSourceSet("jsp20", "8")
+configureSourceSet("jsp21", "8")
+configureSourceSet("jython20", "8")
+configureSourceSet("jython22", "8")
+configureSourceSet("jython25", "8")
+configureSourceSet("core16", "16")
+
+sourceSets {
+    test {
+        val baseDir = "freemarker-test/src/test"
+        java.setSrcDirs(listOf("${baseDir}/java"))
+        resources.setSrcDirs(listOf("${baseDir}/resources"))
+    }
+}
+
+tasks.named<JavaCompile>(sourceSets["test"].compileJavaTaskName) {
+    javaCompiler.set(javaToolchains.compilerFor {
+        languageVersion.set(JavaLanguageVersion.of(testJavaVersion))
+    })
+}
+
+tasks.named<Javadoc>(JavaPlugin.JAVADOC_TASK_NAME) {
+    val coreExcludes = setOf(
+            "LocalContext.java",
+            "CollectionAndSequence.java",
+            "Comment.java",
+            "DebugBreak.java",
+            "Expression.java",
+            "LibraryLoad.java",
+            "Macro.java",
+            "ReturnInstruction.java",
+            "StringArraySequence.java",
+            "TemplateElement.java",
+            "TemplateObject.java",
+            "TextBlock.java",
+            "ReturnInstruction.java",
+            "TokenMgrError.java"
+    )
+
+    val logExcludes = setOf(
+            "SLF4JLoggerFactory.java",
+            "CommonsLoggingLoggerFactory.java"
+    )
+
+    val compileJavaccDestDir = compileJavacc.get().destinationDirectory.get().asFile
+    setSource(source.filter { f ->
+        val fileName = f.name
+        val parentDirName = f.parentFile?.name
+        !(f.startsWith(compileJavaccDestDir) ||
+                fileName.startsWith("_") && fileName.endsWith(".java") ||
+                fileName == "SunInternalXalanXPathSupport.java" ||
+                parentDirName == "core" && coreExcludes.contains(fileName) ||
+                parentDirName == "template" && fileName == "EmptyMap.java" ||
+                parentDirName == "log" && logExcludes.contains(fileName)
+                )
+    })
+}
+
+tasks.named<Test>(JavaPlugin.TEST_TASK_NAME) {
+    val processResourcesName = sourceSets[SourceSet.TEST_SOURCE_SET_NAME].processResourcesTaskName
+    val resourcesDestDir = tasks.named<ProcessResources>(processResourcesName).get().destinationDir.toString()
+    systemProperty("freemarker.test.resourcesDir", resourcesDestDir)
+
+    javaLauncher.set(javaToolchains.launcherFor {
+        languageVersion.set(JavaLanguageVersion.of(testRunnerJavaVersion))
+    })
+}
+
+configurations {
+    compileOnly {
+        exclude(group = "xml-apis", module = "xml-apis")
+    }
+    testImplementation {
+        // Excluding to avoid test failures due to SAX parser conflict.
+        exclude(group = "pull-parser", module = "pull-parser")
+    }
+
+    register("combinedClasspath") {
+        extendsFrom(named("jython25CompileOnly").get())
+        extendsFrom(named("jsp21CompileOnly").get())
+    }
+
+    testImplementation {
+        extendsFrom(named("jython25CompileOnly").get())
+    }
+}
+
+tasks.named<Jar>(sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get().sourcesJarTaskName) {
+    from(compileJavacc.flatMap { it.sourceDirectory })
+    from(resourceTemplatesDir)
+
+    from(files("LICENSE", "NOTICE")) {
+        into("META-INF")
+    }
+}
+
+
+tasks.named<ProcessResources>("processResources") {
+    with(copySpec {
+        from(resourceTemplatesDir)
+        filter<org.apache.tools.ant.filters.ReplaceTokens>(mapOf("tokens" to versionFileTokens))
+    })
+}
+
+val rmicOutputDir: java.nio.file.Path = buildDir.toPath().resolve("rmic")
+
+tasks.register("rmic") {
+    val rmicClasspath = objects.fileCollection()
+
+    val sourceSet = sourceSets[SourceSet.MAIN_SOURCE_SET_NAME]
+    val compileTaskName = sourceSet.compileJavaTaskName
+    val compileTaskRef = tasks.named<JavaCompile>(compileTaskName)
+
+    rmicClasspath.from(compileTaskRef.map { it.classpath })
+    rmicClasspath.from(compileTaskRef.map { it.outputs })
+
+    inputs.files(rmicClasspath)
+    outputs.dir(rmicOutputDir)
+
+    doLast {
+        val allClassesDirs = sourceSet.output.classesDirs
+
+        val rmicRelSrcPath = listOf("freemarker", "debug", "impl")
+        val rmicSrcPattern = "Rmi*Impl.class"
+
+        val rmicRelSrcPathStr = rmicRelSrcPath.joinToString(separator = File.separator)
+        val classesDir = allClassesDirs.find { candidateDir ->
+            Files.newDirectoryStream(candidateDir.toPath().resolve(rmicRelSrcPathStr), rmicSrcPattern).use { files ->
+                val firstFile = files.first { Files.isRegularFile(it) }
+                firstFile != null
+            }
+        }
+
+        if (classesDir != null) {
+            ant.withGroovyBuilder {
+                "rmic"(
+                    "classpath" to rmicClasspath.asPath,
+                    "base" to classesDir.toString(),
+                    "destDir" to rmicOutputDir.toString(),
+                    "includes" to "${rmicRelSrcPath.joinToString("/")}/$rmicSrcPattern",
+                    "verify" to "yes",
+                    "stubversion" to "1.2"
+                )
+            }
+        } else {
+            throw IllegalStateException("Couldn't find classes dir in ${allClassesDirs.asPath}")
+        }
+    }
+}
+
+// This source set is only needed, because the OSGI plugin supports only a single sourceSet.
+// We are deleting it, because otherwise it would fool IDEs that a source root has multiple owners.
+val osgiSourceSet = sourceSets.create("osgi") {
+    val otherSourceSets = allSourceSetNames.map { name -> sourceSets.named(name).get() }
+
+    java {
+        setSrcDirs(otherSourceSets.flatMap { s -> s.java.srcDirs })
+    }
+    resources {
+        setSrcDirs(otherSourceSets.flatMap { s -> s.resources.srcDirs })
+    }
+}
+val osgiClasspath = configurations.named("combinedClasspath").get()
+osgiSourceSet.compileClasspath = osgiClasspath
+osgiSourceSet.runtimeClasspath = osgiClasspath
+sourceSets.remove(osgiSourceSet)
+
+tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
+    from(rmicOutputDir)
+
+    configure<aQute.bnd.gradle.BundleTaskExtension> {
+        bndfile.set(file("osgi.bnd"))
+
+        setSourceSet(osgiSourceSet)
+        properties.putAll(versionProperties)
+        properties.put("moduleOrg", project.group.toString())
+        properties.put("moduleName", project.name)
+    }
+}
+
+tasks.named<Javadoc>(JavaPlugin.JAVADOC_TASK_NAME) {
+    javadocTool.set(javaToolchains.javadocToolFor {
+        languageVersion.set(JavaLanguageVersion.of(javadocJavaVersion))
+    })
+
+    val javadocEncoding = StandardCharsets.UTF_8
+
+    options {
+        locale = "en_US"
+        encoding = javadocEncoding.name()
+        windowTitle = "FreeMarker ${displayVersion} API"
+
+        val extraOptions = this as StandardJavadocDocletOptions
+        extraOptions.links("https://docs.oracle.com/en/java/javase/16/docs/api/")
+
+        extraOptions.author(true)
+        extraOptions.version(true)
+        extraOptions.docEncoding = javadocEncoding.name()
+        extraOptions.charSet = javadocEncoding.name()
+        extraOptions.docTitle = "FreeMarker ${displayVersion}"
+
+        // There are too many to check
+        extraOptions.addStringOption("Xdoclint:-missing", "-quiet")
+    }
+
+    classpath = files(configurations.named("combinedClasspath"))
+
+    doLast {
+        val stylesheetPath = destinationDir!!.toPath().resolve("stylesheet.css")
+        logger.info("Fixing JDK 8 ${stylesheetPath}")
+
+        val ddSelectorStart = "(?:\\.contentContainer\\s+\\.(?:details|description)|\\.serializedFormContainer)\\s+dl\\s+dd\\b.*?\\{[^\\}]*\\b"
+        val ddPropertyEnd = "\\b.+?;"
+
+        val fixRules = listOf(
+            Pair(Regex("/\\* (Javadoc style sheet) \\*/"), "/\\* \\1 - JDK 8 usability fix regexp substitutions applied \\*/"),
+            Pair(Regex("@import url\\('resources/fonts/dejavu.css'\\);\\s*"), ""),
+            Pair(Regex("['\"]DejaVu Sans['\"]"), "Arial"),
+            Pair(Regex("['\"]DejaVu Sans Mono['\"]"), "'Courier New'"),
+            Pair(Regex("['\"]DejaVu Serif['\"]"), "Arial"),
+            Pair(Regex("(?<=[\\s,:])serif\\b"), "sans-serif"),
+            Pair(Regex("(?<=[\\s,:])Georgia,\\s*"), ""),
+            Pair(Regex("['\"]Times New Roman['\"],\\s*"), ""),
+            Pair(Regex("(?<=[\\s,:])Times,\\s*"), ""),
+            Pair(Regex("(?<=[\\s,:])Arial\\s*,\\s*Arial\\b"), ""),
+            Pair(Regex("(${ddSelectorStart})margin${ddPropertyEnd}"), "\\1margin: 5px 0 10px 20px;"),
+            Pair(Regex("(${ddSelectorStart})font-family${ddPropertyEnd}"), "\\1")
+        )
+
+        var stylesheetContent = String(Files.readAllBytes(stylesheetPath), javadocEncoding)
+        for (rule in fixRules) {
+            val prevContent = stylesheetContent
+            stylesheetContent = stylesheetContent.replace(rule.first, rule.second)
+
+            if (prevContent == stylesheetContent) {
+                logger.warn("Javadoc style sheet did not contain anything matching: ${rule.first}")
+            }
+        }
+
+        Files.write(stylesheetPath, stylesheetContent.toByteArray(javadocEncoding))
+    }
+}
+
+fun registerManualTask(taskName: String, locale: String, offline: Boolean) {
+    val manualTaskRef = tasks.register(taskName) {
+        val inputDir = file("freemarker-manual/src/main/docgen/${locale}")
+        inputs.dir(inputDir)
+
+        val outputDir = buildDir.toPath().resolve("manual-${if (offline) "offline" else "online"}").resolve(locale)
+        outputs.dir(outputDir)
+
+        description = if (offline) "Build the Manual for offline use" else "Build the Manual to be upload to the FreeMarker homepage"
+
+        doLast {
+            val transform = org.freemarker.docgen.core.Transform()
+            transform.offline = offline
+            transform.sourceDirectory = inputDir
+            transform.destinationDirectory = outputDir.toFile()
+
+            transform.execute()
+        }
+    }
+
+    tasks.named(LifecycleBasePlugin.BUILD_TASK_NAME) { dependsOn(manualTaskRef) }
+}
+
+registerManualTask("manualOffline", "en_US", true)
+registerManualTask("manualOnline", "en_US", false)
+
+afterEvaluate {
+    // We are setting this, so the pom.xml will be generated properly
+    System.setProperty("line.separator", "\n")
+}
+
+publishing {
+    repositories {
+        maven {
+            val snapshot = project.version.toString().endsWith("-SNAPSHOT")
+            val defaultDeployUrl = if (snapshot) "https://repository.apache.org/content/repositories/snapshots" else "https://repository.apache.org/service/local/staging/deploy/maven2"
+            setUrl(providers.gradleProperty("freemarkerDeployUrl").getOrElse(defaultDeployUrl))
+            name = providers.gradleProperty("freemarkerDeployServerId").getOrElse("apache.releases.https")
+        }
+    }
+
+    publications {
+        val mainPublication = create<MavenPublication>("main") {
+            from(components.getByName("java"))
+            pom {
+                withXml {
+                    val headerComment = asElement().ownerDocument.createComment("""
+
+                        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.
+
+                        """.trimIndent().prependIndent("  ")
+                    )
+                    asElement().insertBefore(headerComment, asElement().firstChild)
+                }
+
+                packaging = "jar"
+                name.set("Apache FreeMarker")
+                description.set("""
+
+                    Google App Engine compliant variation of FreeMarker.
+                    FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
+                    """.trimIndent().prependIndent("    ") + "\n  "
+                )
+                url.set("https://freemarker.apache.org/")
+
+                organization {
+                    name.set("Apache Software Foundation")
+                    url.set("http://apache.org")
+                }
+
+                licenses {
+                    license {
+                        name.set("Apache License, Version 2.0")
+                        url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
+                        distribution.set("repo")
+                    }
+                }
+
+                scm {
+                    connection.set("scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git")
+                    developerConnection.set("scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git")
+                    url.set("https://git-wip-us.apache.org/repos/asf?p=freemarker.git")
+                    tag.set("v${project.version}")
+                }
+
+                issueManagement {
+                    system.set("jira")
+                    url.set("https://issues.apache.org/jira/browse/FREEMARKER/")
+                }
+
+                mailingLists {
+                    mailingList {
+                        name.set("FreeMarker developer list")
+                        post.set("dev@freemarker.apache.org")
+                        subscribe.set("dev-subscribe@freemarker.apache.org")
+                        unsubscribe.set("dev-unsubscribe@freemarker.apache.org")
+                        archive.set("http://mail-archives.apache.org/mod_mbox/freemarker-dev/")
+                    }
+                    mailingList {
+                        name.set("FreeMarker commit and Jira notifications list")
+                        post.set("notifications@freemarker.apache.org")
+                        subscribe.set("notifications-subscribe@freemarker.apache.org")
+                        unsubscribe.set("notifications-unsubscribe@freemarker.apache.org")
+                        archive.set("http://mail-archives.apache.org/mod_mbox/freemarker-notifications/")
+                    }
+                    mailingList {
+                        name.set("FreeMarker management private")
+                        post.set("private@freemarker.apache.org")
+                    }
+                }
+            }
+        }
+        if (doSignPackages.get()) {
+            signing.sign(mainPublication)
+        }
+    }
+}
+
+val distArchiveBaseName = "apache-${name}"
+val distDir = buildDir.toPath().resolve("distributions")
+
+fun registerSignatureTask(archiveTask: TaskProvider<Tar>) {
+    val signTask = tasks.register(archiveTask.name + "Signature") {
+        val archiveFileRef = archiveTask.flatMap { task -> task.archiveFile }
+
+        inputs.file(archiveFileRef)
+        outputs.file(archiveFileRef.map { f -> File(f.asFile.toString() + ".asc") })
+
+        doLast {
+            signing.sign(archiveTask.get().archiveFile.get().asFile)
+        }
+    }
+
+    tasks.named(LifecycleBasePlugin.BUILD_TASK_NAME) {
+        dependsOn(archiveTask)
+
+        if (doSignPackages.get()) {
+            dependsOn(signTask)
+        }
+    }
+}
+
+fun registerCommonFiles(tar: Tar) {
+    tar.from("README.md") {
+        val displayVersion = versionProperties.get("version")!!
+        filter { content -> content.replace("{version}", displayVersion) }
+    }
+
+    tar.from(files("NOTICE", "RELEASE-NOTES"))
+}
+
+val distBin = tasks.register<Tar>("distBin") {
+    compression = Compression.GZIP
+    archiveBaseName.set(distArchiveBaseName)
+    destinationDirectory.set(distDir.toFile())
+    archiveAppendix.set("bin")
+
+    registerCommonFiles(this)
+
+    from("src/dist/bin") {
+        exclude("rat-excludes")
+    }
+
+    val jarFile = tasks.named<Jar>("jar").flatMap { jar -> jar.archiveFile }
+    from(jarFile) {
+        rename { name -> "freemarker.jar" }
+    }
+
+    from(tasks.named("manualOffline")) {
+        into("documentation/_html")
+    }
+
+    from(tasks.named(JavaPlugin.JAVADOC_TASK_NAME)) {
+        into("documentation/_html/api")
+    }
+}
+registerSignatureTask(distBin)
+
+val distSrc = tasks.register<Tar>("distSrc") {
+    compression = Compression.GZIP
+    archiveBaseName.set(distArchiveBaseName)
+    destinationDirectory.set(distDir.toFile())
+    archiveAppendix.set("src")
+
+    registerCommonFiles(this)
+
+    from(files("LICENSE"))
+
+    from(projectDir) {
+        includeEmptyDirs = false
+        include(
+                "src/**",
+                "*/src/**",
+                "**/*.kts",
+                "*.txt",
+                "osgi.bnd",
+                "rat-excludes"
+        )
+        exclude(
+                "/build",
+                "/*/build",
+                "/gradle/wrapper",
+                "/gradlew*",
+                "**/*.bak",
+                "**/*.~*",
+                "*/*.*~"
+        )
+    }
+}
+registerSignatureTask(distSrc)
+
+fun readExcludeFile(excludeFile: File): List<String> {
+    Files.lines(excludeFile.toPath()).use { lines ->
+        return lines
+            .map { it.trim() }
+            .filter { !it.startsWith("#") && !it.isEmpty() }
+            .collect(Collectors.toList())
+    }
+}
+
+tasks.withType<org.nosphere.apache.rat.RatTask>() {
+    doLast {
+        println("RAT (${name} task) report was successful: ${reportDir.get().asFile.toPath().resolve("index.html").toUri()}")
+    }
+}
+
+tasks.named<org.nosphere.apache.rat.RatTask>("rat") {
+    inputDir.set(projectDir)
+    excludes.addAll(readExcludeFile(file("rat-excludes")))
+}
+
+fun registerDistRatTask(taskName: String, excludeFile: File, srcArchiveTaskRef: TaskProvider<Tar>) {
+    val inputTaskName = "${taskName}Prep"
+    val ratInputTask = tasks.register<Sync>(inputTaskName) {
+        dependsOn(srcArchiveTaskRef)
+
+        destinationDir = buildDir.toPath().resolve("rat-prep").resolve(taskName).toFile()
+        from(tarTree(srcArchiveTaskRef.flatMap { it.archiveFile }))
+    }
+
+    val ratTask = tasks.register<org.nosphere.apache.rat.RatTask>(taskName) {
+        dependsOn(ratInputTask)
+
+        group = LifecycleBasePlugin.VERIFICATION_GROUP
+        description = "RAT report for the output of ${srcArchiveTaskRef.name}"
+        inputDir.set(layout.dir(ratInputTask.map { it.destinationDir }))
+        excludes.addAll(readExcludeFile(excludeFile))
+    }
+    tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) {
+        dependsOn(ratTask)
+    }
+}
+
+registerDistRatTask("ratDistBin", file("src/dist/bin/rat-excludes"), distBin)
+registerDistRatTask("ratDistSrc", file("rat-excludes"), distSrc)
+
+// Choose the Jetty version very carefully, as it should implement the same Servlet API, JSP API, and EL API
+// what we declare below, because the same classes will come from Jetty as well. For example, Jetty depends
+// on org.mortbay.jasper:apache-el, which contains the javax.el classes, along with non-javax.el classes, so you
+// can't even exclude it. Similarly, org.eclipse.jetty:apache-jsp contains the JSP API javax.servlet.jsp classes,
+// yet again along with other classes. Anyway, this mess is temporary, as we will migrate to Jakarta, and only
+// support that.
+val jettyVersion = "9.4.53.v20231009"
+val slf4jVersion = "1.6.1"
+val springVersion = "2.5.6.SEC03"
+val tagLibsVersion = "1.2.5"
+
+dependencies {
+    compileOnly("jaxen:jaxen:1.0-FCS")
+    compileOnly("saxpath:saxpath:1.0-FCS")
+    compileOnly("xalan:xalan:2.7.0")
+    compileOnly("jdom:jdom:1.0b8")
+    compileOnly("ant:ant:1.6.5") // FIXME: This could be moved to "jython20CompileOnly"
+    compileOnly("rhino:js:1.6R1")
+    compileOnly("avalon-logkit:avalon-logkit:2.0")
+    compileOnly("org.slf4j:slf4j-api:${slf4jVersion}")
+    compileOnly("org.slf4j:log4j-over-slf4j:${slf4jVersion}")
+    compileOnly("org.slf4j:jcl-over-slf4j:${slf4jVersion}") // FIXME: This seems to be unused
+    compileOnly("commons-logging:commons-logging:1.1.1") // FIXME: This seems to be unused
+    compileOnly("org.zeroturnaround:javarebel-sdk:1.2.2")
+    compileOnly("com.google.code.findbugs:annotations:3.0.0")
+    compileOnly("org.dom4j:dom4j:2.1.3")
+
+    "jsp20CompileOnly"("javax.servlet.jsp:jsp-api:2.0")
+    "jsp20CompileOnly"("javax.servlet:servlet-api:2.4")
+
+    "jsp21CompileOnly"(sourceSets["jsp20"].output)
+    "jsp21CompileOnly"("javax.servlet.jsp:jsp-api:2.1")
+    "jsp21CompileOnly"("javax.servlet:servlet-api:2.5")
+
+    "jython20CompileOnly"("jython:jython:2.1")
+
+    "jython22CompileOnly"(sourceSets["jython20"].output)
+    "jython22CompileOnly"("org.python:jython:2.2.1")
+
+    "jython25CompileOnly"(sourceSets["jython20"].output)
+    "jython25CompileOnly"("org.python:jython:2.5.0")
+
+    testImplementation("junit:junit:4.12")
+    testImplementation("org.hamcrest:hamcrest-library:1.3")
+    testImplementation("ch.qos.logback:logback-classic:1.1.2")
+    testImplementation("commons-io:commons-io:2.7")
+    testImplementation("com.google.guava:guava:29.0-jre")
+    testImplementation("org.eclipse.jetty:jetty-server:${jettyVersion}")
+    testImplementation("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
+    testImplementation("org.eclipse.jetty:jetty-util:${jettyVersion}")
+    testImplementation("org.eclipse.jetty:apache-jsp:${jettyVersion}")
+    // Jetty also contains the servlet-api and jsp-api classes
+
+    testImplementation("displaytag:displaytag:1.2") {
+        exclude(group = "com.lowagie", module = "itext")
+        // We manage logging centrally:
+        exclude(group = "org.slf4j", module = "slf4j-log4j12")
+        exclude(group = "rg.slf4j", module = "jcl104-over-slf4j")
+        exclude(group = "log4j", module = "log4j")
+    }
+
+    // JSP JSTL (not included in Jetty):
+    testImplementation("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
+    testImplementation("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
+
+    // Override Java 9 incompatible version (coming from displaytag):
+    testImplementation("commons-lang:commons-lang:2.6")
+
+    testImplementation("org.springframework:spring-core:${springVersion}") {
+        exclude(group = "commons-logging", module = "commons-logging")
+    }
+    testImplementation("org.springframework:spring-test:${springVersion}") {
+        exclude(group = "commons-logging", module = "commons-logging")
+    }
+}
diff --git a/build.properties.sample b/build.properties.sample
deleted file mode 100644
index dd796c3..0000000
--- a/build.properties.sample
+++ /dev/null
@@ -1,21 +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.
-
-# Copy this file to "build.properties" before editing!
-boot.classpath.j2se1.8=C:/Program Files/Java/jdk1.8.0_66/jre/lib/rt.jar
-mvnCommand=C:/Program Files (x86)/maven3/bin/mvn.bat
-gpgCommand=C:/Program Files (x86)/GNU/GnuPG/pub/gpg.exe
\ No newline at end of file
diff --git a/build.xml b/build.xml
deleted file mode 100644
index c16e571..0000000
--- a/build.xml
+++ /dev/null
@@ -1,955 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-
-<project basedir="." default="jar" name="freemarker"
-         xmlns:ivy="antlib:org.apache.ivy.ant"
-         xmlns:javacc="http://javacc.dev.java.net/"
-         xmlns:docgen="http://freemarker.org/docgen"
-         xmlns:bnd="http://www.aqute.biz/bnd"
-         xmlns:rat="antlib:org.apache.rat.anttasks"
-         xmlns:u="http://freemarker.org/util"
-         xmlns:unless="ant:unless"
->
-
-  <!-- ================================================================== -->
-  <!-- Properties                                                         -->
-  <!-- ================================================================== -->
-
-  <!-- Maven project coordinates: -->
-  <property name="mavenGroupId" value="org.freemarker" />
-  <property name="mavenArtifactId" value="freemarker-gae" />
-  <!-- Ivy project coordinates: -->
-  <property name="moduleOrg" value="org.freemarker" />
-  <property name="moduleName" value="freemarker" />
-  <property name="moduleBranch" value="2.3" />
-
-  <!-- Will be overidden on the Continous Integration server: -->
-  <property name="server.ivy.repo.root" value="${basedir}/build/dummy-server-ivy-repo" />
-
-  <property file="build.properties"/>
-  <condition property="has.explicit.boot.classpath.j2se1.8">
-    <isset property="boot.classpath.j2se1.8"/>
-  </condition>
-  <condition property="has.all.explicit.boot.classpaths">
-    <and>
-      <isset property="has.explicit.boot.classpath.j2se1.8"/>
-    </and>
-  </condition>
-  <available property="atLeastJDK8" classname="java.util.function.Predicate"/>
-
-  <!-- When boot.classpath.j* is missing, these will be the defaults: -->
-  <!-- Note: Target "dist" doesn't allow using these. -->
-  <property name="boot.classpath.j2se1.8" value="${sun.boot.class.path}" />
-
-  <!-- For checking the correctness of the boot.classpath.j2se* -->
-  <available classpath="${boot.classpath.j2se1.8}"
-    classname="java.time.Instant" ignoresystemclasses="true"
-    property="boot.classpath.j2se1.8.correct"
-  />
-
-  <!-- Set up version/timestamp filters and the version property: -->
-  <tstamp>
-    <format property="timestampNice" pattern="yyyy-MM-dd'T'HH:mm:ss'Z'"
-        timezone="UTC" />
-    <format property="timestampInVersion" pattern="yyyyMMdd'T'HHmmss'Z'"
-        timezone="UTC" />
-  </tstamp>
-  <filter token="timestampInVersion" value="${timestampInVersion}" />
-  <filter token="timestampNice" value="${timestampNice}" />
-  <mkdir dir="build"/>
-  <!-- Copying is needed to substitute the timestamps. -->
-  <copy
-      file="src/main/resources/freemarker/version.properties"
-      tofile="build/version.properties.tmp"
-      filtering="true"
-      overwrite="true"
-  />
-  <property file="build/version.properties.tmp" />
-  <delete file="build/version.properties.tmp" />
-  <filter token="version" value="${version}" />
-
-  <property name="dist.dir" value="build/dist" />
-  <property name="dist.archiveBaseName" value="apache-${mavenArtifactId}-${mavenVersion}" />
-  <property name="dist.bin.dir" value="${dist.dir}/bin/${dist.archiveBaseName}-bin" />
-  <property name="dist.src.dir" value="${dist.dir}/src/${dist.archiveBaseName}-src" />
-
-  <!-- ================================================================== -->
-  <!-- Initialization                                                     -->
-  <!-- ================================================================== -->
-
-
-  <target name="clean" description="get rid of all generated files">
-    <delete dir="build" />
-    <delete dir="META-INF" />
-  </target>
-
-  <target name="clean-classes" description="get rid of compiled classes">
-    <delete dir="build/classes" />
-    <delete dir="build/test-classes" />
-    <delete dir="build/coverage/classes" />
-  </target>
-
-  <target name="init">
-    <mkdir dir="build"/>
-  </target>
-
-  <property name="ivy.install.version" value="2.5.0" />
-  <property name="ivy.home" value="${user.home}/.ant" />
-  <property name="ivy.jar.dir" value="${ivy.home}/lib" />
-  <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
-  <target name="download-ivy">
-    <mkdir dir="${ivy.jar.dir}"/>
-    <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
-         dest="${ivy.jar.file}" usetimestamp="true"/>
-  </target>
-
-  <!-- ================================================================= -->
-  <!-- Compilation                                                       -->
-  <!-- ================================================================= -->
-
-  <target name="javacc" depends="init" unless="parser.uptodate"
-    description="Build the parser from its grammar file"
-  >
-    <ivy:cachepath conf="parser" pathid="ivy.dep" />
-    <taskdef name="generate" classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC"
-      uri="http://javacc.dev.java.net/"
-      classpathref="ivy.dep"
-    />
-
-    <property name="_javaccOutputDir"
-      value="build/generated-sources/java/freemarker/core/"
-    />
-
-    <mkdir dir="${_javaccOutputDir}" />
-    <ivy:retrieve conf="parser" pattern="build/javacc-home.tmp/[artifact].[ext]" />
-    <javacc:generate
-      target="src/main/javacc/FTL.jj"
-      outputdirectory="${_javaccOutputDir}"
-      javacchome="build/javacc-home.tmp"
-    />
-    <delete dir="build/javacc-home.tmp" />
-
-    <replace
-      file="${_javaccOutputDir}/FMParserConstants.java"
-      token="public interface FMParserConstants"
-      value="interface FMParserConstants"
-    />
-    <replace
-      file="${_javaccOutputDir}/FMParserTokenManager.java"
-      token="public class FMParserTokenManager"
-      value="class FMParserTokenManager"
-    />
-    <replace
-      file="${_javaccOutputDir}/Token.java"
-      token="public class Token"
-      value="class Token"
-    />
-    <replace
-      file="${_javaccOutputDir}/SimpleCharStream.java"
-      token="public final class SimpleCharStream"
-      value="final class SimpleCharStream"
-    />
-    <replace
-      file="${_javaccOutputDir}/FMParser.java"
-      token="enum"
-      value="ENUM"
-    />
-
-    <!-- As we have a modified version in src/main/java: -->
-    <move
-      file="${_javaccOutputDir}/ParseException.java"
-      tofile="${_javaccOutputDir}/ParseException.java.ignore"
-    />
-    <move
-      file="${_javaccOutputDir}/TokenMgrError.java"
-      tofile="${_javaccOutputDir}/TokenMgrError.java.ignore"
-    />
-  </target>
-
-  <target name="compile" depends="javacc">
-    <fail unless="boot.classpath.j2se1.8.correct"><!--
-      -->The "boot.classpath.j2se1.8" property value (${boot.classpath.j2se1.8}) <!--
-      -->seems to be an incorrect boot classpath. Please fix it in <!--
-      -->the &lt;projectDir>/build.properties file, or wherever you <!--
-      -->set it.<!--
-    --></fail>
-    <echo level="info"><!--
-      -->Using boot classpaths: <!--
-      -->Java 8: ${boot.classpath.j2se1.8}<!--
-      -->Java 16: Current JDK classpath<!--
-    --></echo>
-
-    <!-- Comment out @SuppressFBWarnings, as it causes compilation warnings in dependent Gradle projects -->
-    <delete dir="build/src-main-java-filtered" />
-    <mkdir dir="build/src-main-java-filtered" />
-    <copy toDir="build/src-main-java-filtered">
-      <fileset dir="src/main/java" excludes="**/AdhocTest*" />
-    </copy>
-    <replaceregexp
-        flags="gs" encoding="utf-8"
-        match='(@SuppressFBWarnings\(.+?"\s*\))' replace="/*\1*/"
-    >
-      <fileset dir="build/src-main-java-filtered" includes="**/*.java" />
-    </replaceregexp>
-    <replaceregexp
-        flags="gs" encoding="utf-8"
-        match='(import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;)' replace="// \1"
-    >
-      <fileset dir="build/src-main-java-filtered" includes="**/*.java" />
-    </replaceregexp>
-
-    <mkdir dir="build/classes" />
-
-    <!-- Note: the "build.base" conf doesn't include optional FreeMarker dependencies. -->
-    <ivy:cachepath conf="build.base" pathid="ivy.dep" />
-    <javac destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      excludes="
-        freemarker/core/_Java?*Impl.java,
-        freemarker/ext/jsp/**,
-        freemarker/ext/servlet/**,
-        freemarker/cache/WebappTemplateLoader.java,
-
-        freemarker/ext/jython/**,
-        freemarker/template/utility/JythonRuntime.java,
-        freemarker/ext/ant/**"
-    >
-      <src>
-        <pathelement location="build/src-main-java-filtered" />
-        <pathelement location="build/generated-sources" />
-      </src>
-    </javac>
-
-    <ivy:cachepath conf="build.base" pathid="ivy.dep" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-           debug="on" optimize="off" release="16" encoding="utf-8"
-           includeantruntime="false"
-           classpathref="ivy.dep"
-           includes="freemarker/core/_Java16Impl.java"
-    />
-
-    <ivy:cachepath conf="build.jsp2.0" pathid="ivy.dep.jsp2.0" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep.jsp2.0"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      includes="
-        freemarker/ext/jsp/**,
-        freemarker/ext/servlet/**,
-        freemarker/cache/WebappTemplateLoader.java"
-      excludes="
-        freemarker/ext/jsp/_FreeMarkerPageContext21.java,
-        freemarker/ext/jsp/FreeMarkerJspFactory21.java,
-        freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
-    />
-
-    <!-- There's no build.jsp2.0, as those classes are part of the common build subset. -->
-
-    <ivy:cachepath conf="build.jsp2.1" pathid="ivy.dep.jsp2.1" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep.jsp2.1"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      includes="
-        freemarker/ext/jsp/_FreeMarkerPageContext21.java,
-        freemarker/ext/jsp/FreeMarkerJspFactory21.java,
-        freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
-    />
-
-    <ivy:cachepath conf="build.jython2.0" pathid="ivy.dep.jython2.0" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep.jython2.0"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      includes="
-        freemarker/ext/ant/**,
-        freemarker/template/utility/JythonRuntime.java,
-        freemarker/ext/jython/**"
-      excludes="
-        freemarker/ext/jython/_Jython22VersionAdapter.java,
-        freemarker/ext/jython/_Jython25VersionAdapter.java"
-    />
-
-    <ivy:cachepath conf="build.jython2.2" pathid="ivy.dep.jython2.2" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep.jython2.2"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      includes="
-        freemarker/ext/jython/_Jython22VersionAdapter.java"
-    />
-
-    <ivy:cachepath conf="build.jython2.5" pathid="ivy.dep.jython2.5" />
-    <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
-      debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
-      includeantruntime="false"
-      classpathref="ivy.dep.jython2.5"
-      bootclasspath="${boot.classpath.j2se1.8}"
-      includes="
-        freemarker/ext/jython/_Jython25VersionAdapter.java"
-    />
-
-    <copy toDir="build/classes">
-      <fileset dir="src/main/resources"
-        excludes="
-          freemarker/version.properties"
-      />
-    </copy>
-    <copy toDir="build/classes" filtering="true" overwrite="true">
-      <fileset dir="src/main/resources"
-        includes="
-          freemarker/version.properties"
-      />
-    </copy>
-    <copy toDir="build/classes/META-INF">
-      <fileset dir="src/dist/jar/META-INF" includes="*" />
-    </copy>
-    <delete dir="build/src-main-java-filtered" />
-  </target>
-
-  <target name="compileTest" depends="compile">
-    <mkdir dir="build/test-classes" />
-
-    <ivy:cachepath conf="build.test" pathid="ivy.dep.build.test" />
-    <javac srcdir="src/test/java" destdir="build/test-classes" deprecation="off"
-      debug="on" optimize="off" release="16" encoding="utf-8"
-      includeantruntime="false"
-      classpath="build/classes"
-      classpathref="ivy.dep.build.test"
-    />
-    <copy toDir="build/test-classes">
-      <fileset dir="src/test/resources"
-        excludes=""
-      />
-    </copy>
-  </target>
-
-   <target name="jar" depends="compile">
-    <ivy:cachepath pathid="ivy.dep" conf="bnd" />
-    <taskdef resource="aQute/bnd/ant/taskdef.properties"
-      uri="http://www.aqute.biz/bnd"
-      classpathref="ivy.dep"
-    />
-
-    <!-- Hack: This file should be excluded, but I can't explain that to bnd. -->
-    <!-- We don't have this file in 2.4.X... yet?
-    <move
-        file="build/classes/freemarker/core/SecureRendererImpl.class"
-        tofile="build/SecureRendererImpl.class.tmp"
-        preservelastmodified="true" overwrite="true"
-    />
-    -->
-    <bnd:bnd
-        files="osgi.bnd" eclipse="false"
-        output="build/freemarker.jar"
-    />
-    <!-- Revert previous hack... -->
-    <!-- We don't have this file in 2.4.X... yet?
-    <move
-        file="build/SecureRendererImpl.class.tmp"
-        tofile="build/classes/freemarker/core/SecureRendererImpl.class"
-        preservelastmodified="true" overwrite="true"
-    />
-    -->
-  </target>
-
-  <!-- ================================================================= -->
-  <!-- Testing                                                           -->
-  <!-- ================================================================= -->
-
-  <target name="test" depends="compileTest" description="Run test cases">
-    <mkdir dir="build/junit-reports" />
-    <ivy:cachepath conf="run.test" pathid="ivy.dep.run.test" />
-    <junit haltonfailure="on" logfailedtests="true" fork="true" forkmode="once">
-      <classpath>
-        <pathelement path="build/test-classes" />
-        <pathelement path="build/classes" />
-        <path refid="ivy.dep.run.test" />
-      </classpath>
-      <formatter type="plain" />
-      <formatter type="xml" />
-      <batchtest todir="build/junit-reports">
-        <fileset dir="src/test/java">
-          <include name="**/*Test.java" />
-          <include name="**/*TestSuite.java" />
-          <exclude name="**/Abstract*.java" />
-        </fileset>
-      </batchtest>
-    </junit>
-  </target>
-
-  <!-- ================================================================= -->
-  <!-- Generate docs                                                     -->
-  <!-- ================================================================= -->
-
-  <target name="javadoc" depends="compile" description="Build the JavaDocs">
-    <mkdir dir="build/api" />
-    <delete includeEmptyDirs="yes">
-      <fileset dir="build/api" includes="**/*" />
-    </delete>
-    <!-- javadoc with <fileset> has bugs, so we create a filtered copy: -->
-    <copy todir="build/javadoc-sources">
-      <fileset dir="src/main/java">
-        <exclude name="**/_*.java" />
-        <exclude name="**/SunInternalXalanXPathSupport.java" />
-        <!-- Remove classes that are, I suppose, only accidentally public: -->
-        <exclude name="**/core/LocalContext.java" />
-        <exclude name="**/core/CollectionAndSequence.java" />
-        <exclude name="**/core/Comment.java" />
-        <exclude name="**/core/DebugBreak.java" />
-        <exclude name="**/core/Expression.java" />
-        <exclude name="**/core/LibraryLoad.java" />
-        <exclude name="**/core/Macro.java" />
-        <exclude name="**/core/ReturnInstruction.java" />
-        <exclude name="**/core/StringArraySequence.java" />
-        <exclude name="**/core/TemplateElement.java" />
-        <exclude name="**/core/TemplateObject.java" />
-        <exclude name="**/core/TextBlock.java" />
-        <exclude name="**/core/ReturnInstruction.java" />
-        <exclude name="**/core/TokenMgrError.java" />
-        <exclude name="**/template/EmptyMap.java" />
-        <exclude name="**/log/SLF4JLoggerFactory.java" />
-        <exclude name="**/log/CommonsLoggingLoggerFactory.java" />
-      </fileset>
-    </copy>
-
-    <!-- conf="IDE": as that has to contain all depedencies -->
-    <ivy:cachepath conf="IDE" pathid="ivy.dep" />
-    <javadoc
-      sourcepath="build/javadoc-sources"
-      destdir="build/api"
-      doctitle="FreeMarker ${version}"
-      packagenames="
-        freemarker.debug, freemarker.template.*,
-        freemarker.core.*, freemarker.ext.*,
-        freemarker.cache.*, freemarker.log.*"
-      use="true"
-      version="true"
-      author="true"
-      windowtitle="FreeMarker ${version} API"
-      classpath="build/classes"
-      classpathref="ivy.dep"
-      failonerror="true"
-      charset="UTF-8"
-      docencoding="UTF-8"
-      encoding="UTF-8"
-      locale="en_US"
-    >
-      <link href="https://docs.oracle.com/en/java/javase/16/docs/api/"/>
-    </javadoc>
-    <delete dir="build/javadoc-sources" />
-  </target>
-
-  <!-- ====================== -->
-  <!-- Manual                 -->
-  <!-- ====================== -->
-
-  <macrodef name="manual" uri="http://freemarker.org/util">
-    <attribute name="offline" />
-    <attribute name="locale" />
-    <sequential>
-      <ivy:cachepath conf="manual" pathid="ivy.dep" />
-      <taskdef resource="org/freemarker/docgen/ant/antlib.properties"
-        uri="http://freemarker.org/docgen"
-        classpathref="ivy.dep"
-      />
-
-      <docgen:transform
-        srcdir="src/manual/@{locale}" destdir="build/manual/@{locale}"
-        offline="@{offline}"
-      />
-    </sequential>
-  </macrodef>
-
-  <target name="manualOffline" depends="init" description="Build the Manual for offline use" >
-    <u:manual offline="true" locale="en_US" />
-  </target>
-
-  <target name="manualOnline" depends="init" description="Build the Manual to be upload to the FreeMarker homepage" >
-    <u:manual offline="false" locale="en_US" />
-  </target>
-
-  <target name="manualOffline_zh_CN" depends="init" description="Build the Manual for offline use" >
-    <u:manual offline="true" locale="zh_CN" />
-  </target>
-
-  <target name="manualOnline_zh_CN" depends="init" description="Build the Manual to be upload to the FreeMarker homepage" >
-    <u:manual offline="false" locale="zh_CN" />
-  </target>
-
-
-  <!-- ===================== -->
-  <!-- Distribution building -->
-  <!-- ===================== -->
-
-  <target name="dist"
-    description="Build the FreeMarker distribution files"
-  >
-    <fail
-      unless="has.all.explicit.boot.classpaths"
-      message="All boot.classpath properties must be set in build.properties for dist!"
-    />
-    <fail unless="atLeastJDK8" message="The release should be built with JDK 8+ (you may need to set JAVA_HOME)" />
-    <antcall target="clean" />  <!-- To improve the reliability -->
-    <antcall target="_dist" />
-  </target>
-
-  <target name="_dist"
-    depends="test, jar, javadoc, manualOffline"
-  >
-    <delete dir="${dist.dir}" />
-
-    <!-- ..................................... -->
-    <!-- Binary distribution                   -->
-    <!-- ..................................... -->
-
-    <mkdir dir="${dist.bin.dir}" />
-
-    <!-- Copy txt-s -->
-    <copy todir="${dist.bin.dir}" includeEmptyDirs="no">
-      <fileset dir="." defaultexcludes="no">
-        <include name="README.md" />
-        <!-- LICENSE is binary-distribution-specific, and is copied later. -->
-        <include name="NOTICE" />
-        <include name="RELEASE-NOTES" />
-      </fileset>
-    </copy>
-    <replace
-      file="${dist.bin.dir}/README.md"
-      token="{version}"
-      value="${version}"
-    />
-    <!-- Copy binary-distribution-specific files: -->
-    <copy todir="${dist.bin.dir}/">
-      <fileset dir="src/dist/bin/">
-        <exclude name="rat-excludes" />
-      </fileset>
-    </copy>
-
-    <!-- Copy binary -->
-    <copy file="build/freemarker.jar" tofile="${dist.bin.dir}/freemarker.jar" />
-
-    <!-- Copy documentation -->
-    <mkdir dir="${dist.bin.dir}/documentation" />
-
-    <!--
-      The US English Manual is the source of any translations and thus it's the
-      only one that is guaranteed to be up to date when doing the release, so we
-      only pack that into it.
-    -->
-    <copy todir="${dist.bin.dir}/documentation/_html" includeEmptyDirs="no">
-      <fileset dir="build/manual/en_US" />
-    </copy>
-    <copy todir="${dist.bin.dir}/documentation/_html/api" includeEmptyDirs="no">
-      <fileset dir="build/api" />
-    </copy>
-
-    <u:packageAndSignDist
-        srcDir="${dist.bin.dir}/.."
-        archiveNameWithoutExt="${dist.archiveBaseName}-bin"
-    />
-
-    <!-- ..................................... -->
-    <!-- Source distribution                   -->
-    <!-- ..................................... -->
-
-    <mkdir dir="${dist.src.dir}" />
-
-    <!-- Copy extensionless files: -->
-    <copy todir="${dist.src.dir}" includeEmptyDirs="no">
-      <fileset dir="." defaultexcludes="no">
-        <include name="README.md" />
-        <include name="LICENSE" />
-        <include name="NOTICE" />
-        <include name="RELEASE-NOTES" />
-      </fileset>
-    </copy>
-    <replace
-      file="${dist.src.dir}/README.md"
-      token="{version}"
-      value="${version}"
-    />
-
-    <copy todir="${dist.src.dir}" includeEmptyDirs="no">
-      <fileset dir="." defaultexcludes="no">
-        <exclude name="**/*.bak" />
-        <exclude name="**/*.~*" />
-        <exclude name="**/*.*~" />
-        <include name="src/**" />
-        <include name="*.xml" />
-        <include name="*.sample" />
-        <include name="*.txt" />
-        <include name="osgi.bnd" />
-        <include name=".git*" />
-        <include name="rat-excludes" />
-      </fileset>
-    </copy>
-
-    <u:packageAndSignDist
-        srcDir="${dist.src.dir}/.."
-        archiveNameWithoutExt="${dist.archiveBaseName}-src"
-    />
-  </target>
-
-  <macrodef name="packageAndSignDist" uri="http://freemarker.org/util">
-    <attribute name="srcDir" />
-    <attribute name="archiveNameWithoutExt" />
-    <sequential>
-      <local name="archive.tar"/>
-      <property name="archive.tar" value="build/dist/@{archiveNameWithoutExt}.tar" />
-      <local name="archive.gzip"/>
-      <property name="archive.gzip" value="${archive.tar}.gz" />
-      <delete file="${archive.tar}" />
-      <tar tarfile="${archive.tar}" basedir="@{srcDir}" />
-      <delete file="${archive.gzip}" />
-      <gzip zipfile="${archive.gzip}" src="${archive.tar}" />
-      <delete file="${archive.tar}" />
-
-      <echo>Signing "${archive.gzip}"...</echo>
-      <!-- gpg may hang if it exists: -->
-      <delete file="${archive.gzip}.asc" />
-      <exec executable="${gpgCommand}" failonerror="true">
-        <arg value="--armor" />
-        <arg value="--output" />
-        <arg value="${archive.gzip}.asc" />
-        <arg value="--detach-sig" />
-        <arg value="${archive.gzip}" />
-      </exec>
-
-      <echo>*** Signature verification: ***</echo>
-      <exec executable="${gpgCommand}" failonerror="true">
-        <arg value="--verify" />
-        <arg value="${archive.gzip}.asc" />
-        <arg value="${archive.gzip}" />
-      </exec>
-      <local name="signatureGood" />
-      <local name="signatureGood.y" />
-      <input
-         validargs="y,n"
-         addproperty="signatureGood"
-         unless:set="ci"
-      >Is the above signer the intended one for Apache releases?</input>
-      <condition property="signatureGood.y" unless:set="ci">
-        <equals arg1="y" arg2="${signatureGood}"/>
-      </condition>
-      <fail unless:set="ci" unless="signatureGood.y" message="Task aborted by user." />
-
-      <echo>Creating checksum file for "${archive.gzip}"...</echo>
-      <checksum file="${archive.gzip}" fileext=".sha512" algorithm="SHA-512" forceOverwrite="yes" />
-    </sequential>
-  </macrodef>
-
-  <target name="maven-pom">
-    <echo file="build/pom.xml"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
-<!--
-  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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache</groupId>
-    <artifactId>apache</artifactId>
-    <version>17</version>
-  </parent>
-
-  <groupId>${mavenGroupId}</groupId>
-  <artifactId>${mavenArtifactId}</artifactId>
-  <version>${mavenVersion}</version>
-
-  <packaging>jar</packaging>
-
-  <name>Apache FreeMarker</name>
-  <description>
-    Google App Engine compliant variation of FreeMarker.
-    FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
-  </description>
-  <url>https://freemarker.apache.org/</url>
-  <organization>
-    <name>Apache Software Foundation</name>
-    <url>http://apache.org</url>
-  </organization>
-
-  <licenses>
-    <license>
-      <name>Apache License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</connection>
-    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</developerConnection>
-    <url>https://git-wip-us.apache.org/repos/asf?p=freemarker.git</url>
-    <tag>v${version}</tag>
-  </scm>
-
-  <issueManagement>
-    <system>jira</system>
-    <url>https://issues.apache.org/jira/browse/FREEMARKER/</url>
-  </issueManagement>
-
-  <mailingLists>
-    <mailingList>
-        <name>FreeMarker developer list</name>
-        <post>dev@freemarker.apache.org</post>
-        <subscribe>dev-subscribe@freemarker.apache.org</subscribe>
-        <unsubscribe>dev-unsubscribe@freemarker.apache.org</unsubscribe>
-        <archive>http://mail-archives.apache.org/mod_mbox/freemarker-dev/</archive>
-    </mailingList>
-    <mailingList>
-        <name>FreeMarker commit and Jira notifications list</name>
-        <post>notifications@freemarker.apache.org</post>
-        <subscribe>notifications-subscribe@freemarker.apache.org</subscribe>
-        <unsubscribe>notifications-unsubscribe@freemarker.apache.org</unsubscribe>
-        <archive>http://mail-archives.apache.org/mod_mbox/freemarker-notifications/</archive>
-    </mailingList>
-    <mailingList>
-      <name>FreeMarker management private</name>
-      <post>private@freemarker.apache.org</post>
-    </mailingList>
-  </mailingLists>
-
-  <dependencies>
-    <!-- no required dependencies -->
-  </dependencies>
-</project>
-]]></echo>
-  </target>
-
-  <target name="maven-install" depends="jar, maven-pom"
-      description="Installs the jar into the local maven repo (without signing)">
-		<exec executable="${mvnCommand}" failonerror="true">
-			<arg value="install:install-file" />
-			<arg value="-Dfile=build/freemarker.jar" />
-			<arg value="-DpomFile=build/pom.xml" />
-		</exec>
-  </target>
-
-  <!--
-    Uploads the freemarker.jar that is in the current DISTRIBUTION DIRECTORY
-    to a Maven repository (snapshot or central).
-    Use this after "dist" (without interleaving "clean").
-  -->
-  <target name="maven-dist" depends="maven-pom"
-      description="Releases the already built distro to a Maven repository">
-    <jar destfile="build/maven-source-attachment.jar">
-      <fileset dir="${dist.src.dir}/src/main/java" />
-      <fileset dir="${dist.src.dir}/src/main/resources" />
-      <fileset dir="${dist.src.dir}/src/main/javacc/" />
-      <fileset dir="build/generated-sources/java/" includes="**/*.java" />
-      <metainf dir="${dist.src.dir}" includes="LICENSE, NOTICE" />
-    </jar>
-
-    <mkdir dir="build/javadoc-attachment-metainf"/>
-    <copy todir="build/javadoc-attachment-metainf">
-      <fileset dir="${dist.bin.dir}" includes="NOTICE" />
-    </copy>
-    <copy todir="build/javadoc-attachment-metainf">
-      <fileset dir="src/dist/javadoc/META-INF/" />
-    </copy>
-    <jar destfile="build/maven-javadoc-attachment.jar">
-      <fileset dir="${dist.bin.dir}/documentation/_html/api" />
-      <metainf dir="build/javadoc-attachment-metainf" includes="**/*" />
-    </jar>
-    <delete dir="build/javadoc-attachment-metainf" />
-
-    <!-- These were copy-pasted from the org.apacha:apache parent POM: -->
-    <property name="maven-server-id" value="apache.releases.https" />
-    <condition property="maven-repository-url"
-        value="https://repository.apache.org/content/repositories/snapshots/"
-        else="https://repository.apache.org/service/local/staging/deploy/maven2">
-      <matches pattern="-SNAPSHOT$" string="${mavenVersion}" />
-    </condition>
-    <!-- Snapshot repo: https://repository.apache.org/content/repositories/snapshots/ -->
-    <input
-       validargs="y,n"
-       addproperty="mavenUpload.answer"
-    >
-You are about uploading
-${dist.bin.dir}/freemarker.jar
-and its attachments with Maven coordinates
-${mavenGroupId}:${mavenArtifactId}:${mavenVersion}
-to this Maven repository:
-${maven-repository-url}
-
-Note that it's assumed that you have run `ant dist` just before this.
-Proceed? </input>
-    <condition property="mavenUpload.yes">
-      <equals arg1="y" arg2="${mavenUpload.answer}"/>
-    </condition>
-    <fail unless="mavenUpload.yes" message="Task aborted by user." />
-
-		<!-- Sign and deploy the main artifact -->
-		<exec executable="${mvnCommand}" failonerror="true">
-			<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.6:sign-and-deploy-file" />
-      <!--
-        As we use the gpg plugin instead of a normal Maven "deploy", sadly we can't just
-        inherit the repo URL and repositoryId from the parent POM.
-      -->
-			<arg value="-Durl=${maven-repository-url}" />
-			<arg value="-DrepositoryId=${maven-server-id}" />
-			<arg value="-DpomFile=build/pom.xml" />
-			<arg value="-Dfile=${dist.bin.dir}/freemarker.jar" />
-			<arg value="-Dsources=build/maven-source-attachment.jar" />
-			<arg value="-Djavadoc=build/maven-javadoc-attachment.jar" />
-      <arg value="-Pgpg" />
-		</exec>
-
-    <echo>*****************************************************************</echo>
-    <echo>Check the above lines for any Maven errors!</echo>
-    <echo>Now you need to close and maybe release the staged repo on</echo>
-    <echo>http://repository.apache.org (except for SNAPSHOT versions).</echo>
-    <echo>Note that before releasing, voting is needed!</echo>
-    <echo>*****************************************************************</echo>
-  </target>
-
-  <!-- ================================================================= -->
-  <!-- CI (like Travis).......................                           -->
-  <!-- ================================================================= -->
-
-  <target name="ci-setup">
-    <ivy:settings file="ivysettings-ci.xml" />
-  </target>
-
-  <target name="ci"
-  	depends="ci-setup, clean, _dist"
-  	description="CI should invoke this task"
-  />
-
-  <!-- ================================================================== -->
-  <!-- Dependency management                                              -->
-  <!-- ================================================================== -->
-
-  <target name="report-deps"
-    description="Creates a HTML document that summarizes the dependencies."
-  >
-    <mkdir dir="build/deps-report" />
-    <ivy:resolve />
-    <ivy:report todir="build/deps-report" />
-  </target>
-
-  <target name="ide-dependencies" depends="jar"
-    description="If your IDE has no Ivy support, this generates ide-lib/*.jar for it">
-    <mkdir dir="ide-dependencies" />
-    <delete includeEmptyDirs="true">
-      <fileset dir="ide-dependencies">
-         <include name="*/**" />
-      </fileset>
-    </delete>
-    <ivy:retrieve conf="IDE" pattern="ide-dependencies/[artifact]-[revision].[ext]" />
-
-    <!--
-      Extract META-INF/MANITSET.MF from freemarker.jar and put it into the project directory for Eclipse (this is
-      needed if you want to reference freemarker source code in the context of OSGI development with Eclipse)
-    -->
-    <unzip src="build/freemarker.jar" dest=".">
-      <patternset>
-        <include name="META-INF/*"/>
-        <exclude name="META-INF/LICENSE"/>
-        <exclude name="META-INF/NOTICE"/>
-      </patternset>
-    </unzip>
-    <echo file="META-INF/DO-NOT-EDIT.txt"><!--
-      -->Do not edit the files in this directory! They are extracted from freemarker.jar as part of&#x0a;<!--
-      -->the ide-dependencies Ant task, because Eclipse OSGi support expects them to be here.<!--
-    --></echo>
-
-  <!--
-    Add bndtools support (bnd workspace model), which requires a bnd.bnd file to be present.
-    See https://bndtools.org/concepts.html#workspacerepositoriesproject-model for more information.
-    We copy the existing osgi.bnd to bnd.bnd and replace the variables
-    with values from this build.xml and version.properties
-    The resulting bnd.bnd in the project root is only consumed by Eclipse
-    if the bndtools plugin is installed.
-    bnd.bnd is also in .gitignore, to avoid accidental commits.
-  -->
-    <filter token="moduleOrg" value="${moduleOrg}" />
-    <filter token="moduleName" value="${moduleName}" />
-    <filter filtersfile="build/classes/freemarker/version.properties" />
-
-    <copy
-        file="osgi.bnd"
-        tofile="bnd.bnd"
-        filtering="true"
-        overwrite="true"
-    >
-      <filterchain>
-          <expandproperties />
-      </filterchain>
-    </copy>
-
-
-
-  </target>
-
-  <!-- ================================================================== -->
-  <!-- Misc.                                                              -->
-  <!-- ================================================================== -->
-
-  <target name="rat" description="Generates Apache RAT report">
-    <ivy:cachepath conf="rat" pathid="ivy.dep" />
-    <taskdef
-      uri="antlib:org.apache.rat.anttasks"
-      resource="org/apache/rat/anttasks/antlib.xml"
-      classpathref="ivy.dep"
-    />
-
-    <rat:report reportFile="build/rat-report-root.txt">
-      <fileset dir="" excludesfile="rat-excludes" />
-    </rat:report>
-    <rat:report reportFile="build/rat-report-dist-src.txt">
-      <fileset dir="${dist.src.dir}" excludesfile="rat-excludes" />
-    </rat:report>
-    <rat:report reportFile="build/rat-report-dist-bin.txt">
-      <fileset dir="${dist.bin.dir}" excludesfile="src/dist/bin/rat-excludes" />
-    </rat:report>
-    <echo level="info"><!--
-    -->Rat reports were written into build/rat-report-*.txt<!--
-    --></echo>
-  </target>
-
-</project>
diff --git a/src/main/java/freemarker/cache/AndMatcher.java b/freemarker-core/src/main/java/freemarker/cache/AndMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/AndMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/AndMatcher.java
diff --git a/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/CacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/CacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/CacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/CacheStorage.java
diff --git a/src/main/java/freemarker/cache/CacheStorageWithGetSize.java b/freemarker-core/src/main/java/freemarker/cache/CacheStorageWithGetSize.java
similarity index 100%
rename from src/main/java/freemarker/cache/CacheStorageWithGetSize.java
rename to freemarker-core/src/main/java/freemarker/cache/CacheStorageWithGetSize.java
diff --git a/src/main/java/freemarker/cache/ClassTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/ClassTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/ClassTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/ClassTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/ConcurrentCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/ConcurrentCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/ConcurrentCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/ConcurrentCacheStorage.java
diff --git a/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/FileExtensionMatcher.java b/freemarker-core/src/main/java/freemarker/cache/FileExtensionMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileExtensionMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/FileExtensionMatcher.java
diff --git a/src/main/java/freemarker/cache/FileNameGlobMatcher.java b/freemarker-core/src/main/java/freemarker/cache/FileNameGlobMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileNameGlobMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/FileNameGlobMatcher.java
diff --git a/src/main/java/freemarker/cache/FileTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/FileTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/FileTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/MruCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/MruCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/MruCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/MruCacheStorage.java
diff --git a/src/main/java/freemarker/cache/MultiTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/MultiTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/MultiTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/MultiTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/NotMatcher.java b/freemarker-core/src/main/java/freemarker/cache/NotMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/NotMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/NotMatcher.java
diff --git a/src/main/java/freemarker/cache/NullCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/NullCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/NullCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/NullCacheStorage.java
diff --git a/src/main/java/freemarker/cache/OrMatcher.java b/freemarker-core/src/main/java/freemarker/cache/OrMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/OrMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/OrMatcher.java
diff --git a/src/main/java/freemarker/cache/PathGlobMatcher.java b/freemarker-core/src/main/java/freemarker/cache/PathGlobMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/PathGlobMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/PathGlobMatcher.java
diff --git a/src/main/java/freemarker/cache/PathRegexMatcher.java b/freemarker-core/src/main/java/freemarker/cache/PathRegexMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/PathRegexMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/PathRegexMatcher.java
diff --git a/src/main/java/freemarker/cache/SoftCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/SoftCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/SoftCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/SoftCacheStorage.java
diff --git a/src/main/java/freemarker/cache/StatefulTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/StatefulTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/StatefulTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/StatefulTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/StringTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/StringTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/StringTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/StringTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/StrongCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/StrongCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/StrongCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/StrongCacheStorage.java
diff --git a/src/main/java/freemarker/cache/TemplateCache.java b/freemarker-core/src/main/java/freemarker/cache/TemplateCache.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateCache.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateCache.java
diff --git a/src/main/java/freemarker/cache/TemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java b/freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
diff --git a/src/main/java/freemarker/cache/TemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLoader.java
diff --git a/src/main/java/freemarker/cache/TemplateLoaderUtils.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLoaderUtils.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLoaderUtils.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLoaderUtils.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupContext.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupContext.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupContext.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupContext.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupResult.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupResult.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupResult.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupResult.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupStrategy.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupStrategy.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupStrategy.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupStrategy.java
diff --git a/src/main/java/freemarker/cache/TemplateNameFormat.java b/freemarker-core/src/main/java/freemarker/cache/TemplateNameFormat.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateNameFormat.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateNameFormat.java
diff --git a/src/main/java/freemarker/cache/TemplateSourceMatcher.java b/freemarker-core/src/main/java/freemarker/cache/TemplateSourceMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateSourceMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateSourceMatcher.java
diff --git a/src/main/java/freemarker/cache/URLTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/URLTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/URLTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/URLTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/URLTemplateSource.java b/freemarker-core/src/main/java/freemarker/cache/URLTemplateSource.java
similarity index 100%
rename from src/main/java/freemarker/cache/URLTemplateSource.java
rename to freemarker-core/src/main/java/freemarker/cache/URLTemplateSource.java
diff --git a/src/main/java/freemarker/cache/_CacheAPI.java b/freemarker-core/src/main/java/freemarker/cache/_CacheAPI.java
similarity index 100%
rename from src/main/java/freemarker/cache/_CacheAPI.java
rename to freemarker-core/src/main/java/freemarker/cache/_CacheAPI.java
diff --git a/src/main/java/freemarker/cache/package.html b/freemarker-core/src/main/java/freemarker/cache/package.html
similarity index 100%
rename from src/main/java/freemarker/cache/package.html
rename to freemarker-core/src/main/java/freemarker/cache/package.html
diff --git a/src/main/java/freemarker/core/APINotSupportedTemplateException.java b/freemarker-core/src/main/java/freemarker/core/APINotSupportedTemplateException.java
similarity index 100%
rename from src/main/java/freemarker/core/APINotSupportedTemplateException.java
rename to freemarker-core/src/main/java/freemarker/core/APINotSupportedTemplateException.java
diff --git a/src/main/java/freemarker/core/AbstractJSONLikeFormat.java b/freemarker-core/src/main/java/freemarker/core/AbstractJSONLikeFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/AbstractJSONLikeFormat.java
rename to freemarker-core/src/main/java/freemarker/core/AbstractJSONLikeFormat.java
diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/freemarker-core/src/main/java/freemarker/core/AddConcatExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/AddConcatExpression.java
rename to freemarker-core/src/main/java/freemarker/core/AddConcatExpression.java
diff --git a/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java b/freemarker-core/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
diff --git a/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/AndExpression.java b/freemarker-core/src/main/java/freemarker/core/AndExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/AndExpression.java
rename to freemarker-core/src/main/java/freemarker/core/AndExpression.java
diff --git a/src/main/java/freemarker/core/ArithmeticEngine.java b/freemarker-core/src/main/java/freemarker/core/ArithmeticEngine.java
similarity index 100%
rename from src/main/java/freemarker/core/ArithmeticEngine.java
rename to freemarker-core/src/main/java/freemarker/core/ArithmeticEngine.java
diff --git a/src/main/java/freemarker/core/ArithmeticExpression.java b/freemarker-core/src/main/java/freemarker/core/ArithmeticExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ArithmeticExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ArithmeticExpression.java
diff --git a/src/main/java/freemarker/core/Assignment.java b/freemarker-core/src/main/java/freemarker/core/Assignment.java
similarity index 100%
rename from src/main/java/freemarker/core/Assignment.java
rename to freemarker-core/src/main/java/freemarker/core/Assignment.java
diff --git a/src/main/java/freemarker/core/AssignmentInstruction.java b/freemarker-core/src/main/java/freemarker/core/AssignmentInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/AssignmentInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/AssignmentInstruction.java
diff --git a/src/main/java/freemarker/core/AttemptBlock.java b/freemarker-core/src/main/java/freemarker/core/AttemptBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/AttemptBlock.java
rename to freemarker-core/src/main/java/freemarker/core/AttemptBlock.java
diff --git a/src/main/java/freemarker/core/AutoEscBlock.java b/freemarker-core/src/main/java/freemarker/core/AutoEscBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/AutoEscBlock.java
rename to freemarker-core/src/main/java/freemarker/core/AutoEscBlock.java
diff --git a/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/BlockAssignment.java b/freemarker-core/src/main/java/freemarker/core/BlockAssignment.java
similarity index 100%
rename from src/main/java/freemarker/core/BlockAssignment.java
rename to freemarker-core/src/main/java/freemarker/core/BlockAssignment.java
diff --git a/src/main/java/freemarker/core/BodyInstruction.java b/freemarker-core/src/main/java/freemarker/core/BodyInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/BodyInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/BodyInstruction.java
diff --git a/src/main/java/freemarker/core/BooleanExpression.java b/freemarker-core/src/main/java/freemarker/core/BooleanExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/BooleanExpression.java
rename to freemarker-core/src/main/java/freemarker/core/BooleanExpression.java
diff --git a/src/main/java/freemarker/core/BooleanLiteral.java b/freemarker-core/src/main/java/freemarker/core/BooleanLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/BooleanLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/BooleanLiteral.java
diff --git a/src/main/java/freemarker/core/BoundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/BoundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/BoundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/BoundedRangeModel.java
diff --git a/src/main/java/freemarker/core/BreakInstruction.java b/freemarker-core/src/main/java/freemarker/core/BreakInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/BreakInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/BreakInstruction.java
diff --git a/src/main/java/freemarker/core/BreakOrContinueException.java b/freemarker-core/src/main/java/freemarker/core/BreakOrContinueException.java
similarity index 100%
rename from src/main/java/freemarker/core/BreakOrContinueException.java
rename to freemarker-core/src/main/java/freemarker/core/BreakOrContinueException.java
diff --git a/src/main/java/freemarker/core/BugException.java b/freemarker-core/src/main/java/freemarker/core/BugException.java
similarity index 100%
rename from src/main/java/freemarker/core/BugException.java
rename to freemarker-core/src/main/java/freemarker/core/BugException.java
diff --git a/src/main/java/freemarker/core/BuiltIn.java b/freemarker-core/src/main/java/freemarker/core/BuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltIn.java
diff --git a/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInForDate.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForDate.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForDate.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForDate.java
diff --git a/src/main/java/freemarker/core/BuiltInForHashEx.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForHashEx.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForHashEx.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForHashEx.java
diff --git a/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInForLoopVariable.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForLoopVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForLoopVariable.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForLoopVariable.java
diff --git a/src/main/java/freemarker/core/BuiltInForMarkupOutput.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForMarkupOutput.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForMarkupOutput.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForMarkupOutput.java
diff --git a/src/main/java/freemarker/core/BuiltInForNode.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNode.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNode.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNode.java
diff --git a/src/main/java/freemarker/core/BuiltInForNodeEx.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNodeEx.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNodeEx.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNodeEx.java
diff --git a/src/main/java/freemarker/core/BuiltInForNumber.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNumber.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNumber.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNumber.java
diff --git a/src/main/java/freemarker/core/BuiltInForSequence.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForSequence.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForSequence.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForSequence.java
diff --git a/src/main/java/freemarker/core/BuiltInForString.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForString.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForString.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForString.java
diff --git a/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java b/freemarker-core/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
diff --git a/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java b/freemarker-core/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
diff --git a/src/main/java/freemarker/core/BuiltInsForCallables.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForCallables.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForCallables.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForCallables.java
diff --git a/src/main/java/freemarker/core/BuiltInsForDates.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForDates.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForDates.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForDates.java
diff --git a/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
diff --git a/src/main/java/freemarker/core/BuiltInsForHashes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForHashes.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForHashes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForHashes.java
diff --git a/src/main/java/freemarker/core/BuiltInsForLoopVariables.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForLoopVariables.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
diff --git a/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
diff --git a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
diff --git a/src/main/java/freemarker/core/BuiltInsForNodes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForNodes.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForNodes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForNodes.java
diff --git a/src/main/java/freemarker/core/BuiltInsForNumbers.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForNumbers.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForNumbers.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForNumbers.java
diff --git a/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
diff --git a/src/main/java/freemarker/core/BuiltInsForSequences.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForSequences.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForSequences.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForSequences.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsBasic.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsMisc.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsMisc.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
diff --git a/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/freemarker-core/src/main/java/freemarker/core/BuiltinVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltinVariable.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltinVariable.java
diff --git a/src/main/java/freemarker/core/CFormat.java b/freemarker-core/src/main/java/freemarker/core/CFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CFormat.java
diff --git a/src/main/java/freemarker/core/CSSOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CSSOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CSSOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CSSOutputFormat.java
diff --git a/src/main/java/freemarker/core/CTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/CTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java b/freemarker-core/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
similarity index 100%
rename from src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
rename to freemarker-core/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
diff --git a/src/main/java/freemarker/core/Case.java b/freemarker-core/src/main/java/freemarker/core/Case.java
similarity index 100%
rename from src/main/java/freemarker/core/Case.java
rename to freemarker-core/src/main/java/freemarker/core/Case.java
diff --git a/src/main/java/freemarker/core/CollectionAndSequence.java b/freemarker-core/src/main/java/freemarker/core/CollectionAndSequence.java
similarity index 100%
rename from src/main/java/freemarker/core/CollectionAndSequence.java
rename to freemarker-core/src/main/java/freemarker/core/CollectionAndSequence.java
diff --git a/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/CommandLine.java b/freemarker-core/src/main/java/freemarker/core/CommandLine.java
similarity index 100%
rename from src/main/java/freemarker/core/CommandLine.java
rename to freemarker-core/src/main/java/freemarker/core/CommandLine.java
diff --git a/src/main/java/freemarker/core/Comment.java b/freemarker-core/src/main/java/freemarker/core/Comment.java
similarity index 100%
rename from src/main/java/freemarker/core/Comment.java
rename to freemarker-core/src/main/java/freemarker/core/Comment.java
diff --git a/src/main/java/freemarker/core/CommonMarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CommonMarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CommonMarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CommonMarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/ComparisonExpression.java b/freemarker-core/src/main/java/freemarker/core/ComparisonExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ComparisonExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ComparisonExpression.java
diff --git a/src/main/java/freemarker/core/CompressedBlock.java b/freemarker-core/src/main/java/freemarker/core/CompressedBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/CompressedBlock.java
rename to freemarker-core/src/main/java/freemarker/core/CompressedBlock.java
diff --git a/src/main/java/freemarker/core/ConditionalBlock.java b/freemarker-core/src/main/java/freemarker/core/ConditionalBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/ConditionalBlock.java
rename to freemarker-core/src/main/java/freemarker/core/ConditionalBlock.java
diff --git a/src/main/java/freemarker/core/Configurable.java b/freemarker-core/src/main/java/freemarker/core/Configurable.java
similarity index 100%
rename from src/main/java/freemarker/core/Configurable.java
rename to freemarker-core/src/main/java/freemarker/core/Configurable.java
diff --git a/src/main/java/freemarker/core/ContinueInstruction.java b/freemarker-core/src/main/java/freemarker/core/ContinueInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/ContinueInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/ContinueInstruction.java
diff --git a/src/main/java/freemarker/core/CustomAttribute.java b/freemarker-core/src/main/java/freemarker/core/CustomAttribute.java
similarity index 100%
rename from src/main/java/freemarker/core/CustomAttribute.java
rename to freemarker-core/src/main/java/freemarker/core/CustomAttribute.java
diff --git a/src/main/java/freemarker/core/DebugBreak.java b/freemarker-core/src/main/java/freemarker/core/DebugBreak.java
similarity index 100%
rename from src/main/java/freemarker/core/DebugBreak.java
rename to freemarker-core/src/main/java/freemarker/core/DebugBreak.java
diff --git a/src/main/java/freemarker/core/DefaultToExpression.java b/freemarker-core/src/main/java/freemarker/core/DefaultToExpression.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/core/DefaultToExpression.java
rename to freemarker-core/src/main/java/freemarker/core/DefaultToExpression.java
diff --git a/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java b/freemarker-core/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
similarity index 100%
rename from src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
rename to freemarker-core/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
diff --git a/src/main/java/freemarker/core/DirectiveCallPlace.java b/freemarker-core/src/main/java/freemarker/core/DirectiveCallPlace.java
similarity index 100%
rename from src/main/java/freemarker/core/DirectiveCallPlace.java
rename to freemarker-core/src/main/java/freemarker/core/DirectiveCallPlace.java
diff --git a/src/main/java/freemarker/core/DollarVariable.java b/freemarker-core/src/main/java/freemarker/core/DollarVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/DollarVariable.java
rename to freemarker-core/src/main/java/freemarker/core/DollarVariable.java
diff --git a/src/main/java/freemarker/core/Dot.java b/freemarker-core/src/main/java/freemarker/core/Dot.java
similarity index 100%
rename from src/main/java/freemarker/core/Dot.java
rename to freemarker-core/src/main/java/freemarker/core/Dot.java
diff --git a/src/main/java/freemarker/core/DynamicKeyName.java b/freemarker-core/src/main/java/freemarker/core/DynamicKeyName.java
similarity index 100%
rename from src/main/java/freemarker/core/DynamicKeyName.java
rename to freemarker-core/src/main/java/freemarker/core/DynamicKeyName.java
diff --git a/src/main/java/freemarker/core/ElseOfList.java b/freemarker-core/src/main/java/freemarker/core/ElseOfList.java
similarity index 100%
rename from src/main/java/freemarker/core/ElseOfList.java
rename to freemarker-core/src/main/java/freemarker/core/ElseOfList.java
diff --git a/src/main/java/freemarker/core/Environment.java b/freemarker-core/src/main/java/freemarker/core/Environment.java
similarity index 100%
rename from src/main/java/freemarker/core/Environment.java
rename to freemarker-core/src/main/java/freemarker/core/Environment.java
diff --git a/src/main/java/freemarker/core/EscapeBlock.java b/freemarker-core/src/main/java/freemarker/core/EscapeBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/EscapeBlock.java
rename to freemarker-core/src/main/java/freemarker/core/EscapeBlock.java
diff --git a/src/main/java/freemarker/core/EvalUtil.java b/freemarker-core/src/main/java/freemarker/core/EvalUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/EvalUtil.java
rename to freemarker-core/src/main/java/freemarker/core/EvalUtil.java
diff --git a/src/main/java/freemarker/core/ExistsExpression.java b/freemarker-core/src/main/java/freemarker/core/ExistsExpression.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/core/ExistsExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ExistsExpression.java
diff --git a/src/main/java/freemarker/core/Expression.java b/freemarker-core/src/main/java/freemarker/core/Expression.java
similarity index 100%
rename from src/main/java/freemarker/core/Expression.java
rename to freemarker-core/src/main/java/freemarker/core/Expression.java
diff --git a/src/main/java/freemarker/core/ExpressionWithFixedResult.java b/freemarker-core/src/main/java/freemarker/core/ExpressionWithFixedResult.java
similarity index 100%
rename from src/main/java/freemarker/core/ExpressionWithFixedResult.java
rename to freemarker-core/src/main/java/freemarker/core/ExpressionWithFixedResult.java
diff --git a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java b/freemarker-core/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
similarity index 100%
rename from src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
rename to freemarker-core/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
diff --git a/src/main/java/freemarker/core/FallbackInstruction.java b/freemarker-core/src/main/java/freemarker/core/FallbackInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/FallbackInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/FallbackInstruction.java
diff --git a/src/main/java/freemarker/core/FlowControlException.java b/freemarker-core/src/main/java/freemarker/core/FlowControlException.java
similarity index 100%
rename from src/main/java/freemarker/core/FlowControlException.java
rename to freemarker-core/src/main/java/freemarker/core/FlowControlException.java
diff --git a/src/main/java/freemarker/core/FlushInstruction.java b/freemarker-core/src/main/java/freemarker/core/FlushInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/FlushInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/FlushInstruction.java
diff --git a/src/main/java/freemarker/core/FreeMarkerTree.java b/freemarker-core/src/main/java/freemarker/core/FreeMarkerTree.java
similarity index 100%
rename from src/main/java/freemarker/core/FreeMarkerTree.java
rename to freemarker-core/src/main/java/freemarker/core/FreeMarkerTree.java
diff --git a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java b/freemarker-core/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
similarity index 100%
rename from src/main/java/freemarker/core/GetOptionalTemplateMethod.java
rename to freemarker-core/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
diff --git a/src/main/java/freemarker/core/HTMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/HTMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/HTMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/HTMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/HashLiteral.java b/freemarker-core/src/main/java/freemarker/core/HashLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/HashLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/HashLiteral.java
diff --git a/src/main/java/freemarker/core/ICIChainMember.java b/freemarker-core/src/main/java/freemarker/core/ICIChainMember.java
similarity index 100%
rename from src/main/java/freemarker/core/ICIChainMember.java
rename to freemarker-core/src/main/java/freemarker/core/ICIChainMember.java
diff --git a/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/ISOTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/Identifier.java b/freemarker-core/src/main/java/freemarker/core/Identifier.java
similarity index 100%
rename from src/main/java/freemarker/core/Identifier.java
rename to freemarker-core/src/main/java/freemarker/core/Identifier.java
diff --git a/src/main/java/freemarker/core/IfBlock.java b/freemarker-core/src/main/java/freemarker/core/IfBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/IfBlock.java
rename to freemarker-core/src/main/java/freemarker/core/IfBlock.java
diff --git a/src/main/java/freemarker/core/Include.java b/freemarker-core/src/main/java/freemarker/core/Include.java
similarity index 100%
rename from src/main/java/freemarker/core/Include.java
rename to freemarker-core/src/main/java/freemarker/core/Include.java
diff --git a/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
diff --git a/src/main/java/freemarker/core/Interpolation.java b/freemarker-core/src/main/java/freemarker/core/Interpolation.java
similarity index 100%
rename from src/main/java/freemarker/core/Interpolation.java
rename to freemarker-core/src/main/java/freemarker/core/Interpolation.java
diff --git a/src/main/java/freemarker/core/Interpret.java b/freemarker-core/src/main/java/freemarker/core/Interpret.java
similarity index 100%
rename from src/main/java/freemarker/core/Interpret.java
rename to freemarker-core/src/main/java/freemarker/core/Interpret.java
diff --git a/src/main/java/freemarker/core/InvalidFormatParametersException.java b/freemarker-core/src/main/java/freemarker/core/InvalidFormatParametersException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidFormatParametersException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidFormatParametersException.java
diff --git a/src/main/java/freemarker/core/InvalidFormatStringException.java b/freemarker-core/src/main/java/freemarker/core/InvalidFormatStringException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidFormatStringException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidFormatStringException.java
diff --git a/src/main/java/freemarker/core/InvalidReferenceException.java b/freemarker-core/src/main/java/freemarker/core/InvalidReferenceException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidReferenceException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidReferenceException.java
diff --git a/src/main/java/freemarker/core/Items.java b/freemarker-core/src/main/java/freemarker/core/Items.java
similarity index 100%
rename from src/main/java/freemarker/core/Items.java
rename to freemarker-core/src/main/java/freemarker/core/Items.java
diff --git a/src/main/java/freemarker/core/IteratorBlock.java b/freemarker-core/src/main/java/freemarker/core/IteratorBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/IteratorBlock.java
rename to freemarker-core/src/main/java/freemarker/core/IteratorBlock.java
diff --git a/src/main/java/freemarker/core/JSONCFormat.java b/freemarker-core/src/main/java/freemarker/core/JSONCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JSONCFormat.java
diff --git a/src/main/java/freemarker/core/JSONOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/JSONOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JSONOutputFormat.java
diff --git a/src/main/java/freemarker/core/JSONParser.java b/freemarker-core/src/main/java/freemarker/core/JSONParser.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONParser.java
rename to freemarker-core/src/main/java/freemarker/core/JSONParser.java
diff --git a/src/main/java/freemarker/core/JavaCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptOutputFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
diff --git a/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java b/freemarker-core/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
rename to freemarker-core/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
diff --git a/src/main/java/freemarker/core/LazySequenceIterator.java b/freemarker-core/src/main/java/freemarker/core/LazySequenceIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/LazySequenceIterator.java
rename to freemarker-core/src/main/java/freemarker/core/LazySequenceIterator.java
diff --git a/src/main/java/freemarker/core/LegacyCFormat.java b/freemarker-core/src/main/java/freemarker/core/LegacyCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/LegacyCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/LegacyCFormat.java
diff --git a/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java b/freemarker-core/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
diff --git a/src/main/java/freemarker/core/LibraryLoad.java b/freemarker-core/src/main/java/freemarker/core/LibraryLoad.java
similarity index 100%
rename from src/main/java/freemarker/core/LibraryLoad.java
rename to freemarker-core/src/main/java/freemarker/core/LibraryLoad.java
diff --git a/src/main/java/freemarker/core/ListElseContainer.java b/freemarker-core/src/main/java/freemarker/core/ListElseContainer.java
similarity index 100%
rename from src/main/java/freemarker/core/ListElseContainer.java
rename to freemarker-core/src/main/java/freemarker/core/ListElseContainer.java
diff --git a/src/main/java/freemarker/core/ListLiteral.java b/freemarker-core/src/main/java/freemarker/core/ListLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/ListLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/ListLiteral.java
diff --git a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/LocalContext.java b/freemarker-core/src/main/java/freemarker/core/LocalContext.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalContext.java
rename to freemarker-core/src/main/java/freemarker/core/LocalContext.java
diff --git a/src/main/java/freemarker/core/LocalContextStack.java b/freemarker-core/src/main/java/freemarker/core/LocalContextStack.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalContextStack.java
rename to freemarker-core/src/main/java/freemarker/core/LocalContextStack.java
diff --git a/src/main/java/freemarker/core/LocalLambdaExpression.java b/freemarker-core/src/main/java/freemarker/core/LocalLambdaExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalLambdaExpression.java
rename to freemarker-core/src/main/java/freemarker/core/LocalLambdaExpression.java
diff --git a/src/main/java/freemarker/core/Macro.java b/freemarker-core/src/main/java/freemarker/core/Macro.java
similarity index 100%
rename from src/main/java/freemarker/core/Macro.java
rename to freemarker-core/src/main/java/freemarker/core/Macro.java
diff --git a/src/main/java/freemarker/core/MarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/MarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/MarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/MarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
diff --git a/src/main/java/freemarker/core/MethodCall.java b/freemarker-core/src/main/java/freemarker/core/MethodCall.java
similarity index 100%
rename from src/main/java/freemarker/core/MethodCall.java
rename to freemarker-core/src/main/java/freemarker/core/MethodCall.java
diff --git a/src/main/java/freemarker/core/MiscUtil.java b/freemarker-core/src/main/java/freemarker/core/MiscUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/MiscUtil.java
rename to freemarker-core/src/main/java/freemarker/core/MiscUtil.java
diff --git a/src/main/java/freemarker/core/MixedContent.java b/freemarker-core/src/main/java/freemarker/core/MixedContent.java
similarity index 100%
rename from src/main/java/freemarker/core/MixedContent.java
rename to freemarker-core/src/main/java/freemarker/core/MixedContent.java
diff --git a/src/main/java/freemarker/core/NestedContentNotSupportedException.java b/freemarker-core/src/main/java/freemarker/core/NestedContentNotSupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/NestedContentNotSupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/NestedContentNotSupportedException.java
diff --git a/src/main/java/freemarker/core/NewBI.java b/freemarker-core/src/main/java/freemarker/core/NewBI.java
similarity index 100%
rename from src/main/java/freemarker/core/NewBI.java
rename to freemarker-core/src/main/java/freemarker/core/NewBI.java
diff --git a/src/main/java/freemarker/core/NoAutoEscBlock.java b/freemarker-core/src/main/java/freemarker/core/NoAutoEscBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/NoAutoEscBlock.java
rename to freemarker-core/src/main/java/freemarker/core/NoAutoEscBlock.java
diff --git a/src/main/java/freemarker/core/NoEscapeBlock.java b/freemarker-core/src/main/java/freemarker/core/NoEscapeBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/NoEscapeBlock.java
rename to freemarker-core/src/main/java/freemarker/core/NoEscapeBlock.java
diff --git a/src/main/java/freemarker/core/NonBooleanException.java b/freemarker-core/src/main/java/freemarker/core/NonBooleanException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonBooleanException.java
rename to freemarker-core/src/main/java/freemarker/core/NonBooleanException.java
diff --git a/src/main/java/freemarker/core/NonDateException.java b/freemarker-core/src/main/java/freemarker/core/NonDateException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonDateException.java
rename to freemarker-core/src/main/java/freemarker/core/NonDateException.java
diff --git a/src/main/java/freemarker/core/NonExtendedHashException.java b/freemarker-core/src/main/java/freemarker/core/NonExtendedHashException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonExtendedHashException.java
rename to freemarker-core/src/main/java/freemarker/core/NonExtendedHashException.java
diff --git a/src/main/java/freemarker/core/NonExtendedNodeException.java b/freemarker-core/src/main/java/freemarker/core/NonExtendedNodeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonExtendedNodeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonExtendedNodeException.java
diff --git a/src/main/java/freemarker/core/NonHashException.java b/freemarker-core/src/main/java/freemarker/core/NonHashException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonHashException.java
rename to freemarker-core/src/main/java/freemarker/core/NonHashException.java
diff --git a/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/NonMarkupOutputException.java b/freemarker-core/src/main/java/freemarker/core/NonMarkupOutputException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonMarkupOutputException.java
rename to freemarker-core/src/main/java/freemarker/core/NonMarkupOutputException.java
diff --git a/src/main/java/freemarker/core/NonMethodException.java b/freemarker-core/src/main/java/freemarker/core/NonMethodException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonMethodException.java
rename to freemarker-core/src/main/java/freemarker/core/NonMethodException.java
diff --git a/src/main/java/freemarker/core/NonNamespaceException.java b/freemarker-core/src/main/java/freemarker/core/NonNamespaceException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNamespaceException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNamespaceException.java
diff --git a/src/main/java/freemarker/core/NonNodeException.java b/freemarker-core/src/main/java/freemarker/core/NonNodeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNodeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNodeException.java
diff --git a/src/main/java/freemarker/core/NonNumericalException.java b/freemarker-core/src/main/java/freemarker/core/NonNumericalException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNumericalException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNumericalException.java
diff --git a/src/main/java/freemarker/core/NonSequenceException.java b/freemarker-core/src/main/java/freemarker/core/NonSequenceException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonSequenceException.java
rename to freemarker-core/src/main/java/freemarker/core/NonSequenceException.java
diff --git a/src/main/java/freemarker/core/NonSequenceOrCollectionException.java b/freemarker-core/src/main/java/freemarker/core/NonSequenceOrCollectionException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonSequenceOrCollectionException.java
rename to freemarker-core/src/main/java/freemarker/core/NonSequenceOrCollectionException.java
diff --git a/src/main/java/freemarker/core/NonStringException.java b/freemarker-core/src/main/java/freemarker/core/NonStringException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonStringException.java
rename to freemarker-core/src/main/java/freemarker/core/NonStringException.java
diff --git a/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java b/freemarker-core/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
rename to freemarker-core/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
diff --git a/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java b/freemarker-core/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
diff --git a/src/main/java/freemarker/core/NotExpression.java b/freemarker-core/src/main/java/freemarker/core/NotExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/NotExpression.java
rename to freemarker-core/src/main/java/freemarker/core/NotExpression.java
diff --git a/src/main/java/freemarker/core/NumberLiteral.java b/freemarker-core/src/main/java/freemarker/core/NumberLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/NumberLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/NumberLiteral.java
diff --git a/src/main/java/freemarker/core/NumericalOutput.java b/freemarker-core/src/main/java/freemarker/core/NumericalOutput.java
similarity index 100%
rename from src/main/java/freemarker/core/NumericalOutput.java
rename to freemarker-core/src/main/java/freemarker/core/NumericalOutput.java
diff --git a/src/main/java/freemarker/core/OptInTemplateClassResolver.java b/freemarker-core/src/main/java/freemarker/core/OptInTemplateClassResolver.java
similarity index 100%
rename from src/main/java/freemarker/core/OptInTemplateClassResolver.java
rename to freemarker-core/src/main/java/freemarker/core/OptInTemplateClassResolver.java
diff --git a/src/main/java/freemarker/core/OrExpression.java b/freemarker-core/src/main/java/freemarker/core/OrExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/OrExpression.java
rename to freemarker-core/src/main/java/freemarker/core/OrExpression.java
diff --git a/src/main/java/freemarker/core/OutputFormat.java b/freemarker-core/src/main/java/freemarker/core/OutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormat.java
diff --git a/src/main/java/freemarker/core/OutputFormatBlock.java b/freemarker-core/src/main/java/freemarker/core/OutputFormatBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormatBlock.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormatBlock.java
diff --git a/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
diff --git a/src/main/java/freemarker/core/ParameterRole.java b/freemarker-core/src/main/java/freemarker/core/ParameterRole.java
similarity index 100%
rename from src/main/java/freemarker/core/ParameterRole.java
rename to freemarker-core/src/main/java/freemarker/core/ParameterRole.java
diff --git a/src/main/java/freemarker/core/ParentheticalExpression.java b/freemarker-core/src/main/java/freemarker/core/ParentheticalExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ParentheticalExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ParentheticalExpression.java
diff --git a/src/main/java/freemarker/core/ParseException.java b/freemarker-core/src/main/java/freemarker/core/ParseException.java
similarity index 100%
rename from src/main/java/freemarker/core/ParseException.java
rename to freemarker-core/src/main/java/freemarker/core/ParseException.java
diff --git a/src/main/java/freemarker/core/ParserConfiguration.java b/freemarker-core/src/main/java/freemarker/core/ParserConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/ParserConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/ParserConfiguration.java
diff --git a/src/main/java/freemarker/core/ParsingNotSupportedException.java b/freemarker-core/src/main/java/freemarker/core/ParsingNotSupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/ParsingNotSupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/ParsingNotSupportedException.java
diff --git a/src/main/java/freemarker/core/PlainTextOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/PlainTextOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/PlainTextOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/PlainTextOutputFormat.java
diff --git a/src/main/java/freemarker/core/PropertySetting.java b/freemarker-core/src/main/java/freemarker/core/PropertySetting.java
similarity index 100%
rename from src/main/java/freemarker/core/PropertySetting.java
rename to freemarker-core/src/main/java/freemarker/core/PropertySetting.java
diff --git a/src/main/java/freemarker/core/RTFOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/RTFOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/RTFOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/RTFOutputFormat.java
diff --git a/src/main/java/freemarker/core/Range.java b/freemarker-core/src/main/java/freemarker/core/Range.java
similarity index 100%
rename from src/main/java/freemarker/core/Range.java
rename to freemarker-core/src/main/java/freemarker/core/Range.java
diff --git a/src/main/java/freemarker/core/RangeModel.java b/freemarker-core/src/main/java/freemarker/core/RangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/RangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/RangeModel.java
diff --git a/src/main/java/freemarker/core/RecoveryBlock.java b/freemarker-core/src/main/java/freemarker/core/RecoveryBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/RecoveryBlock.java
rename to freemarker-core/src/main/java/freemarker/core/RecoveryBlock.java
diff --git a/src/main/java/freemarker/core/RecurseNode.java b/freemarker-core/src/main/java/freemarker/core/RecurseNode.java
similarity index 100%
rename from src/main/java/freemarker/core/RecurseNode.java
rename to freemarker-core/src/main/java/freemarker/core/RecurseNode.java
diff --git a/src/main/java/freemarker/core/RegexpHelper.java b/freemarker-core/src/main/java/freemarker/core/RegexpHelper.java
similarity index 100%
rename from src/main/java/freemarker/core/RegexpHelper.java
rename to freemarker-core/src/main/java/freemarker/core/RegexpHelper.java
diff --git a/src/main/java/freemarker/core/ReturnInstruction.java b/freemarker-core/src/main/java/freemarker/core/ReturnInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/ReturnInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/ReturnInstruction.java
diff --git a/src/main/java/freemarker/core/RightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/RightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/RightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/RightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/Sep.java b/freemarker-core/src/main/java/freemarker/core/Sep.java
similarity index 100%
rename from src/main/java/freemarker/core/Sep.java
rename to freemarker-core/src/main/java/freemarker/core/Sep.java
diff --git a/src/main/java/freemarker/core/SequenceIterator.java b/freemarker-core/src/main/java/freemarker/core/SequenceIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/SequenceIterator.java
rename to freemarker-core/src/main/java/freemarker/core/SequenceIterator.java
diff --git a/src/main/java/freemarker/core/SingleIterationCollectionModel.java b/freemarker-core/src/main/java/freemarker/core/SingleIterationCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/core/SingleIterationCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/core/SingleIterationCollectionModel.java
diff --git a/src/main/java/freemarker/core/SpecialBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/SpecialBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/SpecialBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/SpecialBuiltIn.java
diff --git a/src/main/java/freemarker/core/StandardCFormats.java b/freemarker-core/src/main/java/freemarker/core/StandardCFormats.java
similarity index 100%
rename from src/main/java/freemarker/core/StandardCFormats.java
rename to freemarker-core/src/main/java/freemarker/core/StandardCFormats.java
diff --git a/src/main/java/freemarker/core/StopException.java b/freemarker-core/src/main/java/freemarker/core/StopException.java
similarity index 100%
rename from src/main/java/freemarker/core/StopException.java
rename to freemarker-core/src/main/java/freemarker/core/StopException.java
diff --git a/src/main/java/freemarker/core/StopInstruction.java b/freemarker-core/src/main/java/freemarker/core/StopInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/StopInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/StopInstruction.java
diff --git a/src/main/java/freemarker/core/StringArraySequence.java b/freemarker-core/src/main/java/freemarker/core/StringArraySequence.java
similarity index 100%
rename from src/main/java/freemarker/core/StringArraySequence.java
rename to freemarker-core/src/main/java/freemarker/core/StringArraySequence.java
diff --git a/src/main/java/freemarker/core/StringLiteral.java b/freemarker-core/src/main/java/freemarker/core/StringLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/StringLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/StringLiteral.java
diff --git a/src/main/java/freemarker/core/SwitchBlock.java b/freemarker-core/src/main/java/freemarker/core/SwitchBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/SwitchBlock.java
rename to freemarker-core/src/main/java/freemarker/core/SwitchBlock.java
diff --git a/src/main/java/freemarker/core/TemplateClassResolver.java b/freemarker-core/src/main/java/freemarker/core/TemplateClassResolver.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateClassResolver.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateClassResolver.java
diff --git a/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateConfiguration.java b/freemarker-core/src/main/java/freemarker/core/TemplateConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateConfiguration.java
diff --git a/src/main/java/freemarker/core/TemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/TemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateElement.java b/freemarker-core/src/main/java/freemarker/core/TemplateElement.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElement.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElement.java
diff --git a/src/main/java/freemarker/core/TemplateElementArrayBuilder.java b/freemarker-core/src/main/java/freemarker/core/TemplateElementArrayBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElementArrayBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElementArrayBuilder.java
diff --git a/src/main/java/freemarker/core/TemplateElementsToVisit.java b/freemarker-core/src/main/java/freemarker/core/TemplateElementsToVisit.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElementsToVisit.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElementsToVisit.java
diff --git a/src/main/java/freemarker/core/TemplateFormatUtil.java b/freemarker-core/src/main/java/freemarker/core/TemplateFormatUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateFormatUtil.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateFormatUtil.java
diff --git a/src/main/java/freemarker/core/TemplateHTMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateHTMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateHTMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateHTMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateNullModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateNullModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNullModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNullModel.java
diff --git a/src/main/java/freemarker/core/TemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/TemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateObject.java b/freemarker-core/src/main/java/freemarker/core/TemplateObject.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateObject.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateObject.java
diff --git a/src/main/java/freemarker/core/TemplatePostProcessor.java b/freemarker-core/src/main/java/freemarker/core/TemplatePostProcessor.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplatePostProcessor.java
rename to freemarker-core/src/main/java/freemarker/core/TemplatePostProcessor.java
diff --git a/src/main/java/freemarker/core/TemplatePostProcessorException.java b/freemarker-core/src/main/java/freemarker/core/TemplatePostProcessorException.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplatePostProcessorException.java
rename to freemarker-core/src/main/java/freemarker/core/TemplatePostProcessorException.java
diff --git a/src/main/java/freemarker/core/TemplateProcessingTracer.java b/freemarker-core/src/main/java/freemarker/core/TemplateProcessingTracer.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateProcessingTracer.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateProcessingTracer.java
diff --git a/src/main/java/freemarker/core/TemplateRTFOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateRTFOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateRTFOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateRTFOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormat.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormatException.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormatException.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateXMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateXMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateXMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateXMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TextBlock.java b/freemarker-core/src/main/java/freemarker/core/TextBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/TextBlock.java
rename to freemarker-core/src/main/java/freemarker/core/TextBlock.java
diff --git a/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java b/freemarker-core/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
similarity index 100%
rename from src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
rename to freemarker-core/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
diff --git a/src/main/java/freemarker/core/TokenMgrError.java b/freemarker-core/src/main/java/freemarker/core/TokenMgrError.java
similarity index 100%
rename from src/main/java/freemarker/core/TokenMgrError.java
rename to freemarker-core/src/main/java/freemarker/core/TokenMgrError.java
diff --git a/src/main/java/freemarker/core/TransformBlock.java b/freemarker-core/src/main/java/freemarker/core/TransformBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/TransformBlock.java
rename to freemarker-core/src/main/java/freemarker/core/TransformBlock.java
diff --git a/src/main/java/freemarker/core/TrimInstruction.java b/freemarker-core/src/main/java/freemarker/core/TrimInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/TrimInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/TrimInstruction.java
diff --git a/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java b/freemarker-core/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
similarity index 100%
rename from src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
rename to freemarker-core/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
diff --git a/src/main/java/freemarker/core/UnaryPlusMinusExpression.java b/freemarker-core/src/main/java/freemarker/core/UnaryPlusMinusExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/UnaryPlusMinusExpression.java
rename to freemarker-core/src/main/java/freemarker/core/UnaryPlusMinusExpression.java
diff --git a/src/main/java/freemarker/core/UncheckedParseException.java b/freemarker-core/src/main/java/freemarker/core/UncheckedParseException.java
similarity index 100%
rename from src/main/java/freemarker/core/UncheckedParseException.java
rename to freemarker-core/src/main/java/freemarker/core/UncheckedParseException.java
diff --git a/src/main/java/freemarker/core/UndefinedCustomFormatException.java b/freemarker-core/src/main/java/freemarker/core/UndefinedCustomFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/UndefinedCustomFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/UndefinedCustomFormatException.java
diff --git a/src/main/java/freemarker/core/UndefinedOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/UndefinedOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/UndefinedOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/UndefinedOutputFormat.java
diff --git a/src/main/java/freemarker/core/UnexpectedTypeException.java b/freemarker-core/src/main/java/freemarker/core/UnexpectedTypeException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnexpectedTypeException.java
rename to freemarker-core/src/main/java/freemarker/core/UnexpectedTypeException.java
diff --git a/src/main/java/freemarker/core/UnformattableValueException.java b/freemarker-core/src/main/java/freemarker/core/UnformattableValueException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnformattableValueException.java
rename to freemarker-core/src/main/java/freemarker/core/UnformattableValueException.java
diff --git a/src/main/java/freemarker/core/UnifiedCall.java b/freemarker-core/src/main/java/freemarker/core/UnifiedCall.java
similarity index 100%
rename from src/main/java/freemarker/core/UnifiedCall.java
rename to freemarker-core/src/main/java/freemarker/core/UnifiedCall.java
diff --git a/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java b/freemarker-core/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
diff --git a/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java b/freemarker-core/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
diff --git a/src/main/java/freemarker/core/UnparsableValueException.java b/freemarker-core/src/main/java/freemarker/core/UnparsableValueException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnparsableValueException.java
rename to freemarker-core/src/main/java/freemarker/core/UnparsableValueException.java
diff --git a/src/main/java/freemarker/core/UnregisteredOutputFormatException.java b/freemarker-core/src/main/java/freemarker/core/UnregisteredOutputFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnregisteredOutputFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/UnregisteredOutputFormatException.java
diff --git a/src/main/java/freemarker/core/VisitNode.java b/freemarker-core/src/main/java/freemarker/core/VisitNode.java
similarity index 100%
rename from src/main/java/freemarker/core/VisitNode.java
rename to freemarker-core/src/main/java/freemarker/core/VisitNode.java
diff --git a/src/main/java/freemarker/core/XHTMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/XHTMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XHTMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XHTMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/XMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/XMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/XSCFormat.java b/freemarker-core/src/main/java/freemarker/core/XSCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XSCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XSCFormat.java
diff --git a/src/main/java/freemarker/core/XSTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XSTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/_ArrayEnumeration.java b/freemarker-core/src/main/java/freemarker/core/_ArrayEnumeration.java
similarity index 100%
rename from src/main/java/freemarker/core/_ArrayEnumeration.java
rename to freemarker-core/src/main/java/freemarker/core/_ArrayEnumeration.java
diff --git a/src/main/java/freemarker/core/_ArrayIterator.java b/freemarker-core/src/main/java/freemarker/core/_ArrayIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/_ArrayIterator.java
rename to freemarker-core/src/main/java/freemarker/core/_ArrayIterator.java
diff --git a/src/main/java/freemarker/core/_CoreAPI.java b/freemarker-core/src/main/java/freemarker/core/_CoreAPI.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreAPI.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreAPI.java
diff --git a/src/main/java/freemarker/core/_CoreLocaleUtils.java b/freemarker-core/src/main/java/freemarker/core/_CoreLocaleUtils.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreLocaleUtils.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreLocaleUtils.java
diff --git a/src/main/java/freemarker/core/_CoreStringUtils.java b/freemarker-core/src/main/java/freemarker/core/_CoreStringUtils.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreStringUtils.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreStringUtils.java
diff --git a/src/main/java/freemarker/core/_DelayedAOrAn.java b/freemarker-core/src/main/java/freemarker/core/_DelayedAOrAn.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedAOrAn.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedAOrAn.java
diff --git a/src/main/java/freemarker/core/_DelayedConversionToString.java b/freemarker-core/src/main/java/freemarker/core/_DelayedConversionToString.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedConversionToString.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedConversionToString.java
diff --git a/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java b/freemarker-core/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
diff --git a/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
diff --git a/src/main/java/freemarker/core/_DelayedGetMessage.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetMessage.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetMessage.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetMessage.java
diff --git a/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
diff --git a/src/main/java/freemarker/core/_DelayedJQuote.java b/freemarker-core/src/main/java/freemarker/core/_DelayedJQuote.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedJQuote.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedJQuote.java
diff --git a/src/main/java/freemarker/core/_DelayedJoinWithComma.java b/freemarker-core/src/main/java/freemarker/core/_DelayedJoinWithComma.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedJoinWithComma.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedJoinWithComma.java
diff --git a/src/main/java/freemarker/core/_DelayedOrdinal.java b/freemarker-core/src/main/java/freemarker/core/_DelayedOrdinal.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedOrdinal.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedOrdinal.java
diff --git a/src/main/java/freemarker/core/_DelayedShortClassName.java b/freemarker-core/src/main/java/freemarker/core/_DelayedShortClassName.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedShortClassName.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedShortClassName.java
diff --git a/src/main/java/freemarker/core/_DelayedToString.java b/freemarker-core/src/main/java/freemarker/core/_DelayedToString.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedToString.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedToString.java
diff --git a/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java b/freemarker-core/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
diff --git a/src/main/java/freemarker/core/_Java16.java b/freemarker-core/src/main/java/freemarker/core/_Java16.java
similarity index 100%
rename from src/main/java/freemarker/core/_Java16.java
rename to freemarker-core/src/main/java/freemarker/core/_Java16.java
diff --git a/src/main/java/freemarker/core/_JavaVersions.java b/freemarker-core/src/main/java/freemarker/core/_JavaVersions.java
similarity index 100%
rename from src/main/java/freemarker/core/_JavaVersions.java
rename to freemarker-core/src/main/java/freemarker/core/_JavaVersions.java
diff --git a/src/main/java/freemarker/core/_MarkupBuilder.java b/freemarker-core/src/main/java/freemarker/core/_MarkupBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_MarkupBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_MarkupBuilder.java
diff --git a/src/main/java/freemarker/core/_MessageUtil.java b/freemarker-core/src/main/java/freemarker/core/_MessageUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/_MessageUtil.java
rename to freemarker-core/src/main/java/freemarker/core/_MessageUtil.java
diff --git a/src/main/java/freemarker/core/_MiscTemplateException.java b/freemarker-core/src/main/java/freemarker/core/_MiscTemplateException.java
similarity index 100%
rename from src/main/java/freemarker/core/_MiscTemplateException.java
rename to freemarker-core/src/main/java/freemarker/core/_MiscTemplateException.java
diff --git a/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java b/freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
similarity index 100%
rename from src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
rename to freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
diff --git a/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java b/freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
similarity index 100%
rename from src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
rename to freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
diff --git a/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java b/freemarker-core/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
rename to freemarker-core/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
diff --git a/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java b/freemarker-core/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
similarity index 100%
rename from src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
rename to freemarker-core/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
diff --git a/src/main/java/freemarker/core/_SortedArraySet.java b/freemarker-core/src/main/java/freemarker/core/_SortedArraySet.java
similarity index 100%
rename from src/main/java/freemarker/core/_SortedArraySet.java
rename to freemarker-core/src/main/java/freemarker/core/_SortedArraySet.java
diff --git a/src/main/java/freemarker/core/_TemplateModelException.java b/freemarker-core/src/main/java/freemarker/core/_TemplateModelException.java
similarity index 100%
rename from src/main/java/freemarker/core/_TemplateModelException.java
rename to freemarker-core/src/main/java/freemarker/core/_TemplateModelException.java
diff --git a/src/main/java/freemarker/core/_TimeZoneBuilder.java b/freemarker-core/src/main/java/freemarker/core/_TimeZoneBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_TimeZoneBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_TimeZoneBuilder.java
diff --git a/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java b/freemarker-core/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
diff --git a/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java b/freemarker-core/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
rename to freemarker-core/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
diff --git a/src/main/java/freemarker/core/_UnmodifiableSet.java b/freemarker-core/src/main/java/freemarker/core/_UnmodifiableSet.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnmodifiableSet.java
rename to freemarker-core/src/main/java/freemarker/core/_UnmodifiableSet.java
diff --git a/src/main/java/freemarker/core/package.html b/freemarker-core/src/main/java/freemarker/core/package.html
similarity index 100%
rename from src/main/java/freemarker/core/package.html
rename to freemarker-core/src/main/java/freemarker/core/package.html
diff --git a/src/main/java/freemarker/debug/Breakpoint.java b/freemarker-core/src/main/java/freemarker/debug/Breakpoint.java
similarity index 100%
rename from src/main/java/freemarker/debug/Breakpoint.java
rename to freemarker-core/src/main/java/freemarker/debug/Breakpoint.java
diff --git a/src/main/java/freemarker/debug/DebugModel.java b/freemarker-core/src/main/java/freemarker/debug/DebugModel.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebugModel.java
rename to freemarker-core/src/main/java/freemarker/debug/DebugModel.java
diff --git a/src/main/java/freemarker/debug/DebuggedEnvironment.java b/freemarker-core/src/main/java/freemarker/debug/DebuggedEnvironment.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggedEnvironment.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggedEnvironment.java
diff --git a/src/main/java/freemarker/debug/Debugger.java b/freemarker-core/src/main/java/freemarker/debug/Debugger.java
similarity index 100%
rename from src/main/java/freemarker/debug/Debugger.java
rename to freemarker-core/src/main/java/freemarker/debug/Debugger.java
diff --git a/src/main/java/freemarker/debug/DebuggerClient.java b/freemarker-core/src/main/java/freemarker/debug/DebuggerClient.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggerClient.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggerClient.java
diff --git a/src/main/java/freemarker/debug/DebuggerListener.java b/freemarker-core/src/main/java/freemarker/debug/DebuggerListener.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggerListener.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggerListener.java
diff --git a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java b/freemarker-core/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
similarity index 100%
rename from src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
rename to freemarker-core/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
diff --git a/src/main/java/freemarker/debug/impl/DebuggerServer.java b/freemarker-core/src/main/java/freemarker/debug/impl/DebuggerServer.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/DebuggerServer.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/DebuggerServer.java
diff --git a/src/main/java/freemarker/debug/impl/DebuggerService.java b/freemarker-core/src/main/java/freemarker/debug/impl/DebuggerService.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/DebuggerService.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/DebuggerService.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerService.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerService.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
diff --git a/src/main/java/freemarker/debug/package.html b/freemarker-core/src/main/java/freemarker/debug/package.html
similarity index 100%
rename from src/main/java/freemarker/debug/package.html
rename to freemarker-core/src/main/java/freemarker/debug/package.html
diff --git a/src/main/java/freemarker/ext/beans/APIModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/APIModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/APIModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/APIModel.java
diff --git a/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/ArgumentTypes.java b/freemarker-core/src/main/java/freemarker/ext/beans/ArgumentTypes.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ArgumentTypes.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ArgumentTypes.java
diff --git a/src/main/java/freemarker/ext/beans/ArrayModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/ArrayModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ArrayModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ArrayModel.java
diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeanModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeanModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeanModel.java
diff --git a/src/main/java/freemarker/ext/beans/BeansModelCache.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansModelCache.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansModelCache.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansModelCache.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapper.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapper.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
diff --git a/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/BooleanModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/BooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BooleanModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BooleanModel.java
diff --git a/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/CharacterOrString.java b/freemarker-core/src/main/java/freemarker/ext/beans/CharacterOrString.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CharacterOrString.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CharacterOrString.java
diff --git a/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
diff --git a/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospector.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospector.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassIntrospector.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospector.java
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
diff --git a/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/CollectionAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/CollectionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CollectionAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CollectionAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/CollectionModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/CollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CollectionModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CollectionModel.java
diff --git a/src/main/java/freemarker/ext/beans/ConstructorMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/ConstructorMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ConstructorMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ConstructorMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/DateModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/DateModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/DateModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/DateModel.java
diff --git a/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/EnumerationModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/EnumerationModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EnumerationModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EnumerationModel.java
diff --git a/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java b/freemarker-core/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
diff --git a/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/FieldMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/FieldMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/FieldMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/FieldMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/HashAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/HashAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/HashAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/HashAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/InvalidPropertyException.java b/freemarker-core/src/main/java/freemarker/ext/beans/InvalidPropertyException.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/ext/beans/InvalidPropertyException.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/InvalidPropertyException.java
diff --git a/src/main/java/freemarker/ext/beans/IteratorModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/IteratorModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/IteratorModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/IteratorModel.java
diff --git a/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java b/freemarker-core/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
diff --git a/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MapModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/MapModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MapModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MapModel.java
diff --git a/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/MemberMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
diff --git a/src/main/java/freemarker/ext/beans/MethodMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/MethodSorter.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodSorter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodSorter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodSorter.java
diff --git a/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java b/freemarker-core/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
diff --git a/src/main/java/freemarker/ext/beans/NumberModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/NumberModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/NumberModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/NumberModel.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethods.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
diff --git a/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java b/freemarker-core/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
diff --git a/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/ResourceBundleModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ResourceBundleModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
diff --git a/src/main/java/freemarker/ext/beans/SequenceAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/SequenceAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SequenceAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SequenceAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/SetAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/SetAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SetAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SetAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMapModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMapModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMapModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMapModel.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMethod.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethod.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMethod.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethod.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMethodModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMethodModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
diff --git a/src/main/java/freemarker/ext/beans/SingletonCustomizer.java b/freemarker-core/src/main/java/freemarker/ext/beans/SingletonCustomizer.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SingletonCustomizer.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SingletonCustomizer.java
diff --git a/src/main/java/freemarker/ext/beans/StaticModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/StaticModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StaticModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StaticModel.java
diff --git a/src/main/java/freemarker/ext/beans/StaticModels.java b/freemarker-core/src/main/java/freemarker/ext/beans/StaticModels.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StaticModels.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StaticModels.java
diff --git a/src/main/java/freemarker/ext/beans/StringModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/StringModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StringModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StringModel.java
diff --git a/src/main/java/freemarker/ext/beans/TemplateAccessible.java b/freemarker-core/src/main/java/freemarker/ext/beans/TemplateAccessible.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/TemplateAccessible.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/TemplateAccessible.java
diff --git a/src/main/java/freemarker/ext/beans/TypeFlags.java b/freemarker-core/src/main/java/freemarker/ext/beans/TypeFlags.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/TypeFlags.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/TypeFlags.java
diff --git a/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/_BeansAPI.java b/freemarker-core/src/main/java/freemarker/ext/beans/_BeansAPI.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_BeansAPI.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_BeansAPI.java
diff --git a/src/main/java/freemarker/ext/beans/_EnumModels.java b/freemarker-core/src/main/java/freemarker/ext/beans/_EnumModels.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_EnumModels.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_EnumModels.java
diff --git a/src/main/java/freemarker/ext/beans/_MethodUtil.java b/freemarker-core/src/main/java/freemarker/ext/beans/_MethodUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_MethodUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_MethodUtil.java
diff --git a/src/main/java/freemarker/ext/beans/package.html b/freemarker-core/src/main/java/freemarker/ext/beans/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/beans/package.html
rename to freemarker-core/src/main/java/freemarker/ext/beans/package.html
diff --git a/src/main/java/freemarker/ext/dom/AtAtKey.java b/freemarker-core/src/main/java/freemarker/ext/dom/AtAtKey.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/AtAtKey.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/AtAtKey.java
diff --git a/src/main/java/freemarker/ext/dom/AttributeNodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/AttributeNodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/DocumentModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/DocumentModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DocumentModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DocumentModel.java
diff --git a/src/main/java/freemarker/ext/dom/DocumentTypeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DocumentTypeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
diff --git a/src/main/java/freemarker/ext/dom/DomStringUtil.java b/freemarker-core/src/main/java/freemarker/ext/dom/DomStringUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DomStringUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DomStringUtil.java
diff --git a/src/main/java/freemarker/ext/dom/ElementModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/ElementModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/ElementModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/ElementModel.java
diff --git a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/NodeOutputter.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeOutputter.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeOutputter.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeOutputter.java
diff --git a/src/main/java/freemarker/ext/dom/PINodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/PINodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/PINodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/PINodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/Transform.java b/freemarker-core/src/main/java/freemarker/ext/dom/Transform.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/Transform.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/Transform.java
diff --git a/src/main/java/freemarker/ext/dom/XPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/XPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/XPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/XPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/XalanXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/XalanXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/_ExtDomApi.java b/freemarker-core/src/main/java/freemarker/ext/dom/_ExtDomApi.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/_ExtDomApi.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/_ExtDomApi.java
diff --git a/src/main/java/freemarker/ext/dom/package.html b/freemarker-core/src/main/java/freemarker/ext/dom/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/dom/package.html
rename to freemarker-core/src/main/java/freemarker/ext/dom/package.html
diff --git a/src/main/java/freemarker/ext/jdom/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/jdom/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jdom/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/jdom/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/jdom/package.html b/freemarker-core/src/main/java/freemarker/ext/jdom/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jdom/package.html
rename to freemarker-core/src/main/java/freemarker/ext/jdom/package.html
diff --git a/src/main/java/freemarker/ext/package.html b/freemarker-core/src/main/java/freemarker/ext/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/package.html
rename to freemarker-core/src/main/java/freemarker/ext/package.html
diff --git a/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
diff --git a/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
diff --git a/src/main/java/freemarker/ext/rhino/RhinoWrapper.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoWrapper.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
diff --git a/src/main/java/freemarker/ext/rhino/package.html b/freemarker-core/src/main/java/freemarker/ext/rhino/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/package.html
rename to freemarker-core/src/main/java/freemarker/ext/rhino/package.html
diff --git a/src/main/java/freemarker/ext/util/IdentityHashMap.java b/freemarker-core/src/main/java/freemarker/ext/util/IdentityHashMap.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/IdentityHashMap.java
rename to freemarker-core/src/main/java/freemarker/ext/util/IdentityHashMap.java
diff --git a/src/main/java/freemarker/ext/util/ModelCache.java b/freemarker-core/src/main/java/freemarker/ext/util/ModelCache.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/ModelCache.java
rename to freemarker-core/src/main/java/freemarker/ext/util/ModelCache.java
diff --git a/src/main/java/freemarker/ext/util/ModelFactory.java b/freemarker-core/src/main/java/freemarker/ext/util/ModelFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/ModelFactory.java
rename to freemarker-core/src/main/java/freemarker/ext/util/ModelFactory.java
diff --git a/src/main/java/freemarker/ext/util/WrapperTemplateModel.java b/freemarker-core/src/main/java/freemarker/ext/util/WrapperTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/WrapperTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/ext/util/WrapperTemplateModel.java
diff --git a/src/main/java/freemarker/ext/util/package.html b/freemarker-core/src/main/java/freemarker/ext/util/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/util/package.html
rename to freemarker-core/src/main/java/freemarker/ext/util/package.html
diff --git a/src/main/java/freemarker/ext/xml/Namespaces.java b/freemarker-core/src/main/java/freemarker/ext/xml/Namespaces.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/Namespaces.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/Namespaces.java
diff --git a/src/main/java/freemarker/ext/xml/Navigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/Navigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/Navigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/Navigator.java
diff --git a/src/main/java/freemarker/ext/xml/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/xml/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/xml/NodeOperator.java b/freemarker-core/src/main/java/freemarker/ext/xml/NodeOperator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/NodeOperator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/NodeOperator.java
diff --git a/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/_DomNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_DomNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_DomNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_DomNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java b/freemarker-core/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
diff --git a/src/main/java/freemarker/ext/xml/_JdomNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_JdomNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_JdomNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_JdomNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/package.html b/freemarker-core/src/main/java/freemarker/ext/xml/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/xml/package.html
rename to freemarker-core/src/main/java/freemarker/ext/xml/package.html
diff --git a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
diff --git a/src/main/java/freemarker/log/Logger.java b/freemarker-core/src/main/java/freemarker/log/Logger.java
similarity index 100%
rename from src/main/java/freemarker/log/Logger.java
rename to freemarker-core/src/main/java/freemarker/log/Logger.java
diff --git a/src/main/java/freemarker/log/LoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/LoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/LoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/LoggerFactory.java
diff --git a/src/main/java/freemarker/log/SLF4JLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/SLF4JLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/SLF4JLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/SLF4JLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_AvalonLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_AvalonLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_AvalonLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_AvalonLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_JULLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_JULLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_JULLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_JULLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_Log4jLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_Log4jLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_Log4jLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_Log4jLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java b/freemarker-core/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
similarity index 100%
rename from src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
rename to freemarker-core/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
diff --git a/src/main/java/freemarker/log/_NullLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_NullLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_NullLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_NullLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_SLF4JLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_SLF4JLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
diff --git a/src/main/java/freemarker/log/package.html b/freemarker-core/src/main/java/freemarker/log/package.html
similarity index 100%
rename from src/main/java/freemarker/log/package.html
rename to freemarker-core/src/main/java/freemarker/log/package.html
diff --git a/src/main/java/freemarker/template/AdapterTemplateModel.java b/freemarker-core/src/main/java/freemarker/template/AdapterTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/AdapterTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/AdapterTemplateModel.java
diff --git a/src/main/java/freemarker/template/AttemptExceptionReporter.java b/freemarker-core/src/main/java/freemarker/template/AttemptExceptionReporter.java
similarity index 100%
rename from src/main/java/freemarker/template/AttemptExceptionReporter.java
rename to freemarker-core/src/main/java/freemarker/template/AttemptExceptionReporter.java
diff --git a/src/main/java/freemarker/template/Configuration.java b/freemarker-core/src/main/java/freemarker/template/Configuration.java
similarity index 100%
rename from src/main/java/freemarker/template/Configuration.java
rename to freemarker-core/src/main/java/freemarker/template/Configuration.java
diff --git a/src/main/java/freemarker/template/DefaultArrayAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultArrayAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultArrayAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultArrayAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultEnumerationAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultEnumerationAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultIterableAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultIterableAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultIterableAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultIterableAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultIteratorAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultIteratorAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultIteratorAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultIteratorAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultListAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultListAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultListAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultListAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultMapAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultMapAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultMapAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultMapAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapper.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
diff --git a/src/main/java/freemarker/template/EmptyMap.java b/freemarker-core/src/main/java/freemarker/template/EmptyMap.java
similarity index 100%
rename from src/main/java/freemarker/template/EmptyMap.java
rename to freemarker-core/src/main/java/freemarker/template/EmptyMap.java
diff --git a/src/main/java/freemarker/template/FalseTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/FalseTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/GeneralPurposeNothing.java b/freemarker-core/src/main/java/freemarker/template/GeneralPurposeNothing.java
similarity index 100%
rename from src/main/java/freemarker/template/GeneralPurposeNothing.java
rename to freemarker-core/src/main/java/freemarker/template/GeneralPurposeNothing.java
diff --git a/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java b/freemarker-core/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
diff --git a/src/main/java/freemarker/template/LocalizedString.java b/freemarker-core/src/main/java/freemarker/template/LocalizedString.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/template/LocalizedString.java
rename to freemarker-core/src/main/java/freemarker/template/LocalizedString.java
diff --git a/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java b/freemarker-core/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
similarity index 100%
rename from src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
rename to freemarker-core/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
diff --git a/src/main/java/freemarker/template/MalformedTemplateNameException.java b/freemarker-core/src/main/java/freemarker/template/MalformedTemplateNameException.java
similarity index 100%
rename from src/main/java/freemarker/template/MalformedTemplateNameException.java
rename to freemarker-core/src/main/java/freemarker/template/MalformedTemplateNameException.java
diff --git a/src/main/java/freemarker/template/MapKeyValuePairIterator.java b/freemarker-core/src/main/java/freemarker/template/MapKeyValuePairIterator.java
similarity index 100%
rename from src/main/java/freemarker/template/MapKeyValuePairIterator.java
rename to freemarker-core/src/main/java/freemarker/template/MapKeyValuePairIterator.java
diff --git a/src/main/java/freemarker/template/ObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/ObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/ObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/ObjectWrapper.java
diff --git a/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java b/freemarker-core/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
rename to freemarker-core/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
diff --git a/src/main/java/freemarker/template/ResourceBundleLocalizedString.java b/freemarker-core/src/main/java/freemarker/template/ResourceBundleLocalizedString.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/template/ResourceBundleLocalizedString.java
rename to freemarker-core/src/main/java/freemarker/template/ResourceBundleLocalizedString.java
diff --git a/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/SimpleCollection.java b/freemarker-core/src/main/java/freemarker/template/SimpleCollection.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleCollection.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleCollection.java
diff --git a/src/main/java/freemarker/template/SimpleDate.java b/freemarker-core/src/main/java/freemarker/template/SimpleDate.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleDate.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleDate.java
diff --git a/src/main/java/freemarker/template/SimpleHash.java b/freemarker-core/src/main/java/freemarker/template/SimpleHash.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleHash.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleHash.java
diff --git a/src/main/java/freemarker/template/SimpleList.java b/freemarker-core/src/main/java/freemarker/template/SimpleList.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleList.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleList.java
diff --git a/src/main/java/freemarker/template/SimpleNumber.java b/freemarker-core/src/main/java/freemarker/template/SimpleNumber.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleNumber.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleNumber.java
diff --git a/src/main/java/freemarker/template/SimpleObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/SimpleObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleObjectWrapper.java
diff --git a/src/main/java/freemarker/template/SimpleScalar.java b/freemarker-core/src/main/java/freemarker/template/SimpleScalar.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleScalar.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleScalar.java
diff --git a/src/main/java/freemarker/template/SimpleSequence.java b/freemarker-core/src/main/java/freemarker/template/SimpleSequence.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleSequence.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleSequence.java
diff --git a/src/main/java/freemarker/template/Template.java b/freemarker-core/src/main/java/freemarker/template/Template.java
similarity index 100%
rename from src/main/java/freemarker/template/Template.java
rename to freemarker-core/src/main/java/freemarker/template/Template.java
diff --git a/src/main/java/freemarker/template/TemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/TemplateCollectionModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateCollectionModel.java
diff --git a/src/main/java/freemarker/template/TemplateCollectionModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateCollectionModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateCollectionModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateCollectionModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateDateModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateDateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDateModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDateModel.java
diff --git a/src/main/java/freemarker/template/TemplateDirectiveBody.java b/freemarker-core/src/main/java/freemarker/template/TemplateDirectiveBody.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDirectiveBody.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDirectiveBody.java
diff --git a/src/main/java/freemarker/template/TemplateDirectiveModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateDirectiveModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDirectiveModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDirectiveModel.java
diff --git a/src/main/java/freemarker/template/TemplateException.java b/freemarker-core/src/main/java/freemarker/template/TemplateException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateException.java
diff --git a/src/main/java/freemarker/template/TemplateExceptionHandler.java b/freemarker-core/src/main/java/freemarker/template/TemplateExceptionHandler.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateExceptionHandler.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateExceptionHandler.java
diff --git a/src/main/java/freemarker/template/TemplateHashModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModel.java
diff --git a/src/main/java/freemarker/template/TemplateHashModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateHashModelEx2.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx2.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModelEx2.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx2.java
diff --git a/src/main/java/freemarker/template/TemplateMethodModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateMethodModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateMethodModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateMethodModel.java
diff --git a/src/main/java/freemarker/template/TemplateMethodModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateMethodModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateMethodModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateMethodModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModel.java
diff --git a/src/main/java/freemarker/template/TemplateModelAdapter.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelAdapter.java
diff --git a/src/main/java/freemarker/template/TemplateModelException.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelException.java
diff --git a/src/main/java/freemarker/template/TemplateModelIterator.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelIterator.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelIterator.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelIterator.java
diff --git a/src/main/java/freemarker/template/TemplateModelListSequence.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelListSequence.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelListSequence.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelListSequence.java
diff --git a/src/main/java/freemarker/template/TemplateModelWithAPISupport.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelWithAPISupport.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelWithAPISupport.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelWithAPISupport.java
diff --git a/src/main/java/freemarker/template/TemplateNodeModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNodeModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNodeModel.java
diff --git a/src/main/java/freemarker/template/TemplateNodeModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateNodeModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNodeModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNodeModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateNotFoundException.java b/freemarker-core/src/main/java/freemarker/template/TemplateNotFoundException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNotFoundException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNotFoundException.java
diff --git a/src/main/java/freemarker/template/TemplateNumberModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateNumberModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNumberModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNumberModel.java
diff --git a/src/main/java/freemarker/template/TemplateScalarModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateScalarModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateScalarModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateScalarModel.java
diff --git a/src/main/java/freemarker/template/TemplateSequenceModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateSequenceModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateSequenceModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateSequenceModel.java
diff --git a/src/main/java/freemarker/template/TemplateTransformModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateTransformModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateTransformModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateTransformModel.java
diff --git a/src/main/java/freemarker/template/TransformControl.java b/freemarker-core/src/main/java/freemarker/template/TransformControl.java
similarity index 100%
rename from src/main/java/freemarker/template/TransformControl.java
rename to freemarker-core/src/main/java/freemarker/template/TransformControl.java
diff --git a/src/main/java/freemarker/template/TrueTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TrueTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/Version.java b/freemarker-core/src/main/java/freemarker/template/Version.java
similarity index 100%
rename from src/main/java/freemarker/template/Version.java
rename to freemarker-core/src/main/java/freemarker/template/Version.java
diff --git a/src/main/java/freemarker/template/WrappingTemplateModel.java b/freemarker-core/src/main/java/freemarker/template/WrappingTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/WrappingTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/WrappingTemplateModel.java
diff --git a/src/main/java/freemarker/template/_ObjectWrappers.java b/freemarker-core/src/main/java/freemarker/template/_ObjectWrappers.java
similarity index 100%
rename from src/main/java/freemarker/template/_ObjectWrappers.java
rename to freemarker-core/src/main/java/freemarker/template/_ObjectWrappers.java
diff --git a/src/main/java/freemarker/template/_TemplateAPI.java b/freemarker-core/src/main/java/freemarker/template/_TemplateAPI.java
similarity index 100%
rename from src/main/java/freemarker/template/_TemplateAPI.java
rename to freemarker-core/src/main/java/freemarker/template/_TemplateAPI.java
diff --git a/src/main/java/freemarker/template/_VersionInts.java b/freemarker-core/src/main/java/freemarker/template/_VersionInts.java
similarity index 100%
rename from src/main/java/freemarker/template/_VersionInts.java
rename to freemarker-core/src/main/java/freemarker/template/_VersionInts.java
diff --git a/src/main/java/freemarker/template/package.html b/freemarker-core/src/main/java/freemarker/template/package.html
similarity index 100%
rename from src/main/java/freemarker/template/package.html
rename to freemarker-core/src/main/java/freemarker/template/package.html
diff --git a/src/main/java/freemarker/template/utility/CaptureOutput.java b/freemarker-core/src/main/java/freemarker/template/utility/CaptureOutput.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/CaptureOutput.java
rename to freemarker-core/src/main/java/freemarker/template/utility/CaptureOutput.java
diff --git a/src/main/java/freemarker/template/utility/ClassUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/ClassUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ClassUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ClassUtil.java
diff --git a/src/main/java/freemarker/template/utility/CollectionUtils.java b/freemarker-core/src/main/java/freemarker/template/utility/CollectionUtils.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/CollectionUtils.java
rename to freemarker-core/src/main/java/freemarker/template/utility/CollectionUtils.java
diff --git a/src/main/java/freemarker/template/utility/Collections12.java b/freemarker-core/src/main/java/freemarker/template/utility/Collections12.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Collections12.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Collections12.java
diff --git a/src/main/java/freemarker/template/utility/Constants.java b/freemarker-core/src/main/java/freemarker/template/utility/Constants.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Constants.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Constants.java
diff --git a/src/main/java/freemarker/template/utility/DOMNodeModel.java b/freemarker-core/src/main/java/freemarker/template/utility/DOMNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DOMNodeModel.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DOMNodeModel.java
diff --git a/src/main/java/freemarker/template/utility/DateUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/DateUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DateUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DateUtil.java
diff --git a/src/main/java/freemarker/template/utility/DeepUnwrap.java b/freemarker-core/src/main/java/freemarker/template/utility/DeepUnwrap.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DeepUnwrap.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DeepUnwrap.java
diff --git a/src/main/java/freemarker/template/utility/Execute.java b/freemarker-core/src/main/java/freemarker/template/utility/Execute.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Execute.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Execute.java
diff --git a/src/main/java/freemarker/template/utility/HtmlEscape.java b/freemarker-core/src/main/java/freemarker/template/utility/HtmlEscape.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/HtmlEscape.java
rename to freemarker-core/src/main/java/freemarker/template/utility/HtmlEscape.java
diff --git a/src/main/java/freemarker/template/utility/NormalizeNewlines.java b/freemarker-core/src/main/java/freemarker/template/utility/NormalizeNewlines.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NormalizeNewlines.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NormalizeNewlines.java
diff --git a/src/main/java/freemarker/template/utility/NullArgumentException.java b/freemarker-core/src/main/java/freemarker/template/utility/NullArgumentException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NullArgumentException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NullArgumentException.java
diff --git a/src/main/java/freemarker/template/utility/NullWriter.java b/freemarker-core/src/main/java/freemarker/template/utility/NullWriter.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NullWriter.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NullWriter.java
diff --git a/src/main/java/freemarker/template/utility/NumberUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/NumberUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NumberUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NumberUtil.java
diff --git a/src/main/java/freemarker/template/utility/ObjectConstructor.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectConstructor.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectConstructor.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectConstructor.java
diff --git a/src/main/java/freemarker/template/utility/ObjectFactory.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectFactory.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectFactory.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectFactory.java
diff --git a/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
diff --git a/src/main/java/freemarker/template/utility/OptimizerUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/OptimizerUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/OptimizerUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/OptimizerUtil.java
diff --git a/src/main/java/freemarker/template/utility/RichObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/utility/RichObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/RichObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/utility/RichObjectWrapper.java
diff --git a/src/main/java/freemarker/template/utility/SecurityUtilities.java b/freemarker-core/src/main/java/freemarker/template/utility/SecurityUtilities.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/SecurityUtilities.java
rename to freemarker-core/src/main/java/freemarker/template/utility/SecurityUtilities.java
diff --git a/src/main/java/freemarker/template/utility/StandardCompress.java b/freemarker-core/src/main/java/freemarker/template/utility/StandardCompress.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/StandardCompress.java
rename to freemarker-core/src/main/java/freemarker/template/utility/StandardCompress.java
diff --git a/src/main/java/freemarker/template/utility/StringUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/StringUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/StringUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/StringUtil.java
diff --git a/src/main/java/freemarker/template/utility/TemplateModelUtils.java b/freemarker-core/src/main/java/freemarker/template/utility/TemplateModelUtils.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/TemplateModelUtils.java
rename to freemarker-core/src/main/java/freemarker/template/utility/TemplateModelUtils.java
diff --git a/src/main/java/freemarker/template/utility/ToCanonical.java b/freemarker-core/src/main/java/freemarker/template/utility/ToCanonical.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ToCanonical.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ToCanonical.java
diff --git a/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java b/freemarker-core/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
diff --git a/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java b/freemarker-core/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
diff --git a/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java b/freemarker-core/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
diff --git a/src/main/java/freemarker/template/utility/WriteProtectable.java b/freemarker-core/src/main/java/freemarker/template/utility/WriteProtectable.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/WriteProtectable.java
rename to freemarker-core/src/main/java/freemarker/template/utility/WriteProtectable.java
diff --git a/src/main/java/freemarker/template/utility/XmlEscape.java b/freemarker-core/src/main/java/freemarker/template/utility/XmlEscape.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/XmlEscape.java
rename to freemarker-core/src/main/java/freemarker/template/utility/XmlEscape.java
diff --git a/src/main/java/freemarker/template/utility/package.html b/freemarker-core/src/main/java/freemarker/template/utility/package.html
similarity index 100%
rename from src/main/java/freemarker/template/utility/package.html
rename to freemarker-core/src/main/java/freemarker/template/utility/package.html
diff --git a/src/main/javacc/FTL.jj b/freemarker-core/src/main/javacc/freemarker/core/FTL.jj
similarity index 100%
rename from src/main/javacc/FTL.jj
rename to freemarker-core/src/main/javacc/freemarker/core/FTL.jj
diff --git a/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java b/freemarker-core/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
similarity index 100%
rename from src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
rename to freemarker-core/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
diff --git a/src/main/misc/overloadedNumberRules/README.txt b/freemarker-core/src/main/misc/overloadedNumberRules/README.txt
similarity index 100%
rename from src/main/misc/overloadedNumberRules/README.txt
rename to freemarker-core/src/main/misc/overloadedNumberRules/README.txt
diff --git a/src/main/misc/overloadedNumberRules/config.fmpp b/freemarker-core/src/main/misc/overloadedNumberRules/config.fmpp
similarity index 100%
rename from src/main/misc/overloadedNumberRules/config.fmpp
rename to freemarker-core/src/main/misc/overloadedNumberRules/config.fmpp
diff --git a/src/main/misc/overloadedNumberRules/generator.ftl b/freemarker-core/src/main/misc/overloadedNumberRules/generator.ftl
similarity index 100%
rename from src/main/misc/overloadedNumberRules/generator.ftl
rename to freemarker-core/src/main/misc/overloadedNumberRules/generator.ftl
diff --git a/src/main/misc/overloadedNumberRules/prices.ods b/freemarker-core/src/main/misc/overloadedNumberRules/prices.ods
similarity index 100%
rename from src/main/misc/overloadedNumberRules/prices.ods
rename to freemarker-core/src/main/misc/overloadedNumberRules/prices.ods
Binary files differ
diff --git a/src/main/resources/freemarker/version.properties b/freemarker-core/src/main/resource-templates/freemarker/version.properties
similarity index 100%
rename from src/main/resources/freemarker/version.properties
rename to freemarker-core/src/main/resource-templates/freemarker/version.properties
diff --git a/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules b/freemarker-core/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
similarity index 100%
rename from src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
rename to freemarker-core/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
diff --git a/src/main/resources/freemarker/ext/beans/unsafeMethods.properties b/freemarker-core/src/main/resources/freemarker/ext/beans/unsafeMethods.properties
similarity index 100%
rename from src/main/resources/freemarker/ext/beans/unsafeMethods.properties
rename to freemarker-core/src/main/resources/freemarker/ext/beans/unsafeMethods.properties
diff --git a/src/main/java/freemarker/core/_Java16Impl.java b/freemarker-core16/src/main/java/freemarker/core/_Java16Impl.java
similarity index 100%
rename from src/main/java/freemarker/core/_Java16Impl.java
rename to freemarker-core16/src/main/java/freemarker/core/_Java16Impl.java
diff --git a/src/main/java/freemarker/cache/WebappTemplateLoader.java b/freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/WebappTemplateLoader.java
rename to freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
diff --git a/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
diff --git a/src/main/java/freemarker/ext/jsp/EventForwarding.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/EventForwarding.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
diff --git a/src/main/java/freemarker/ext/jsp/FreemarkerTag.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreemarkerTag.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
diff --git a/src/main/java/freemarker/ext/jsp/JspContextModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspContextModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
diff --git a/src/main/java/freemarker/ext/jsp/JspTagModelBase.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspTagModelBase.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
diff --git a/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
diff --git a/src/main/java/freemarker/ext/jsp/PageContextFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/PageContextFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
diff --git a/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TagTransformModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
diff --git a/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TaglibFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
diff --git a/src/main/java/freemarker/ext/jsp/package.html b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/package.html
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
diff --git a/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/IncludePage.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/IncludePage.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
diff --git a/src/main/java/freemarker/ext/servlet/InitParamParser.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/InitParamParser.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
diff --git a/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/package.html b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/package.html
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
diff --git a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
diff --git a/src/main/java/freemarker/ext/ant/JythonAntTask.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/JythonAntTask.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/JythonAntTask.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/JythonAntTask.java
diff --git a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
diff --git a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
diff --git a/src/main/java/freemarker/ext/ant/package.html b/freemarker-jython20/src/main/java/freemarker/ext/ant/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/ant/package.html
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/package.html
diff --git a/src/main/java/freemarker/ext/jython/JythonHashModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonHashModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonHashModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonModelCache.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModelCache.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonModelCache.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModelCache.java
diff --git a/src/main/java/freemarker/ext/jython/JythonNumberModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonNumberModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonNumberModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonNumberModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonSequenceModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonSequenceModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
diff --git a/src/main/java/freemarker/ext/jython/JythonWrapper.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonWrapper.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonWrapper.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/package.html b/freemarker-jython20/src/main/java/freemarker/ext/jython/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jython/package.html
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/package.html
diff --git a/src/main/java/freemarker/template/utility/JythonRuntime.java b/freemarker-jython20/src/main/java/freemarker/template/utility/JythonRuntime.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/JythonRuntime.java
rename to freemarker-jython20/src/main/java/freemarker/template/utility/JythonRuntime.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java b/freemarker-jython22/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
rename to freemarker-jython22/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java b/freemarker-jython25/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
rename to freemarker-jython25/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
diff --git a/src/manual/en_US/book.xml b/freemarker-manual/src/main/docgen/en_US/book.xml
similarity index 100%
rename from src/manual/en_US/book.xml
rename to freemarker-manual/src/main/docgen/en_US/book.xml
diff --git a/src/manual/en_US/docgen-help/editors-readme.txt b/freemarker-manual/src/main/docgen/en_US/docgen-help/editors-readme.txt
similarity index 100%
rename from src/manual/en_US/docgen-help/editors-readme.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-help/editors-readme.txt
diff --git a/src/manual/en_US/docgen-misc/copyrightComment.txt b/freemarker-manual/src/main/docgen/en_US/docgen-misc/copyrightComment.txt
similarity index 100%
rename from src/manual/en_US/docgen-misc/copyrightComment.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-misc/copyrightComment.txt
diff --git a/src/manual/en_US/docgen-misc/googleAnalytics.html b/freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
similarity index 100%
rename from src/manual/en_US/docgen-misc/googleAnalytics.html
rename to freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
diff --git a/src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
Binary files differ
diff --git a/src/manual/en_US/docgen-originals/figures/odg-convert-howto.txt b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/odg-convert-howto.txt
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/odg-convert-howto.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/odg-convert-howto.txt
diff --git a/src/manual/en_US/docgen-originals/figures/overview.odg b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/overview.odg
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
Binary files differ
diff --git a/src/manual/en_US/docgen-originals/figures/tree_with_alpha.png b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
Binary files differ
diff --git a/src/manual/en_US/docgen.cjson b/freemarker-manual/src/main/docgen/en_US/docgen.cjson
similarity index 100%
rename from src/manual/en_US/docgen.cjson
rename to freemarker-manual/src/main/docgen/en_US/docgen.cjson
diff --git a/src/manual/en_US/favicon.png b/freemarker-manual/src/main/docgen/en_US/favicon.png
similarity index 100%
rename from src/manual/en_US/favicon.png
rename to freemarker-manual/src/main/docgen/en_US/favicon.png
Binary files differ
diff --git a/src/manual/en_US/figures/model2sketch.png b/freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
similarity index 100%
rename from src/manual/en_US/figures/model2sketch.png
rename to freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
Binary files differ
diff --git a/src/manual/en_US/figures/overview.png b/freemarker-manual/src/main/docgen/en_US/figures/overview.png
similarity index 100%
rename from src/manual/en_US/figures/overview.png
rename to freemarker-manual/src/main/docgen/en_US/figures/overview.png
Binary files differ
diff --git a/src/manual/en_US/figures/tree.png b/freemarker-manual/src/main/docgen/en_US/figures/tree.png
similarity index 100%
rename from src/manual/en_US/figures/tree.png
rename to freemarker-manual/src/main/docgen/en_US/figures/tree.png
Binary files differ
diff --git a/src/manual/en_US/logo.png b/freemarker-manual/src/main/docgen/en_US/logo.png
similarity index 100%
rename from src/manual/en_US/logo.png
rename to freemarker-manual/src/main/docgen/en_US/logo.png
Binary files differ
diff --git a/src/test/java/freemarker/cache/FileTemplateLoaderTest.java b/freemarker-test/src/test/java/freemarker/cache/FileTemplateLoaderTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/FileTemplateLoaderTest.java
rename to freemarker-test/src/test/java/freemarker/cache/FileTemplateLoaderTest.java
diff --git a/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java b/freemarker-test/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
rename to freemarker-test/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
diff --git a/src/test/java/freemarker/cache/TemplateCacheTest.java b/freemarker-test/src/test/java/freemarker/cache/TemplateCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateCacheTest.java
rename to freemarker-test/src/test/java/freemarker/cache/TemplateCacheTest.java
diff --git a/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java b/freemarker-test/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
rename to freemarker-test/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
diff --git a/src/test/java/freemarker/cache/TemplateNameFormatTest.java b/freemarker-test/src/test/java/freemarker/cache/TemplateNameFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateNameFormatTest.java
rename to freemarker-test/src/test/java/freemarker/cache/TemplateNameFormatTest.java
diff --git a/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java b/freemarker-test/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
rename to freemarker-test/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
diff --git a/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/ASTPrinter.java b/freemarker-test/src/test/java/freemarker/core/ASTPrinter.java
similarity index 100%
rename from src/test/java/freemarker/core/ASTPrinter.java
rename to freemarker-test/src/test/java/freemarker/core/ASTPrinter.java
diff --git a/src/test/java/freemarker/core/ASTTest.java b/freemarker-test/src/test/java/freemarker/core/ASTTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ASTTest.java
rename to freemarker-test/src/test/java/freemarker/core/ASTTest.java
diff --git a/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java b/freemarker-test/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
similarity index 100%
rename from src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
rename to freemarker-test/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
diff --git a/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/ArgsSpecialVariableTest.java b/freemarker-test/src/test/java/freemarker/core/ArgsSpecialVariableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ArgsSpecialVariableTest.java
rename to freemarker-test/src/test/java/freemarker/core/ArgsSpecialVariableTest.java
diff --git a/src/test/java/freemarker/core/ArithmeticEngineTest.java b/freemarker-test/src/test/java/freemarker/core/ArithmeticEngineTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ArithmeticEngineTest.java
rename to freemarker-test/src/test/java/freemarker/core/ArithmeticEngineTest.java
diff --git a/src/test/java/freemarker/core/AttemptLoggingTest.java b/freemarker-test/src/test/java/freemarker/core/AttemptLoggingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/AttemptLoggingTest.java
rename to freemarker-test/src/test/java/freemarker/core/AttemptLoggingTest.java
diff --git a/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java b/freemarker-test/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
rename to freemarker-test/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
diff --git a/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java b/freemarker-test/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
similarity index 100%
rename from src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
rename to freemarker-test/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
diff --git a/src/test/java/freemarker/core/CAndCnBuiltInTest.java b/freemarker-test/src/test/java/freemarker/core/CAndCnBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CAndCnBuiltInTest.java
rename to freemarker-test/src/test/java/freemarker/core/CAndCnBuiltInTest.java
diff --git a/src/test/java/freemarker/core/CFormatTemplateTest.java b/freemarker-test/src/test/java/freemarker/core/CFormatTemplateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CFormatTemplateTest.java
rename to freemarker-test/src/test/java/freemarker/core/CFormatTemplateTest.java
diff --git a/src/test/java/freemarker/core/CTemplateNumberFormatTest.java b/freemarker-test/src/test/java/freemarker/core/CTemplateNumberFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CTemplateNumberFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/CTemplateNumberFormatTest.java
diff --git a/src/test/java/freemarker/core/CallerTemplateNameTest.java b/freemarker-test/src/test/java/freemarker/core/CallerTemplateNameTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CallerTemplateNameTest.java
rename to freemarker-test/src/test/java/freemarker/core/CallerTemplateNameTest.java
diff --git a/src/test/java/freemarker/core/CamelCaseTest.java b/freemarker-test/src/test/java/freemarker/core/CamelCaseTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CamelCaseTest.java
rename to freemarker-test/src/test/java/freemarker/core/CamelCaseTest.java
diff --git a/src/test/java/freemarker/core/CanonicalFormTest.java b/freemarker-test/src/test/java/freemarker/core/CanonicalFormTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CanonicalFormTest.java
rename to freemarker-test/src/test/java/freemarker/core/CanonicalFormTest.java
diff --git a/src/test/java/freemarker/core/CapturingAssignmentTest.java b/freemarker-test/src/test/java/freemarker/core/CapturingAssignmentTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CapturingAssignmentTest.java
rename to freemarker-test/src/test/java/freemarker/core/CapturingAssignmentTest.java
diff --git a/src/test/java/freemarker/core/CoercionToTextualTest.java b/freemarker-test/src/test/java/freemarker/core/CoercionToTextualTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CoercionToTextualTest.java
rename to freemarker-test/src/test/java/freemarker/core/CoercionToTextualTest.java
diff --git a/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/ConcatenatedSequenceTest.java b/freemarker-test/src/test/java/freemarker/core/ConcatenatedSequenceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ConcatenatedSequenceTest.java
rename to freemarker-test/src/test/java/freemarker/core/ConcatenatedSequenceTest.java
diff --git a/src/test/java/freemarker/core/ConfigurableTest.java b/freemarker-test/src/test/java/freemarker/core/ConfigurableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ConfigurableTest.java
rename to freemarker-test/src/test/java/freemarker/core/ConfigurableTest.java
diff --git a/src/test/java/freemarker/core/CoreLocaleUtilsTest.java b/freemarker-test/src/test/java/freemarker/core/CoreLocaleUtilsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CoreLocaleUtilsTest.java
rename to freemarker-test/src/test/java/freemarker/core/CoreLocaleUtilsTest.java
diff --git a/src/test/java/freemarker/core/CustomCFormat.java b/freemarker-test/src/test/java/freemarker/core/CustomCFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomCFormat.java
rename to freemarker-test/src/test/java/freemarker/core/CustomCFormat.java
diff --git a/src/test/java/freemarker/core/CustomHTMLOutputFormat.java b/freemarker-test/src/test/java/freemarker/core/CustomHTMLOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomHTMLOutputFormat.java
rename to freemarker-test/src/test/java/freemarker/core/CustomHTMLOutputFormat.java
diff --git a/src/test/java/freemarker/core/CustomTemplateHTMLModel.java b/freemarker-test/src/test/java/freemarker/core/CustomTemplateHTMLModel.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomTemplateHTMLModel.java
rename to freemarker-test/src/test/java/freemarker/core/CustomTemplateHTMLModel.java
diff --git a/src/test/java/freemarker/core/DateFormatTest.java b/freemarker-test/src/test/java/freemarker/core/DateFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DateFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/DateFormatTest.java
diff --git a/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java b/freemarker-test/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
rename to freemarker-test/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
diff --git a/src/test/java/freemarker/core/DirectiveCallPlaceTest.java b/freemarker-test/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DirectiveCallPlaceTest.java
rename to freemarker-test/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
diff --git a/src/test/java/freemarker/core/DummyOutputFormat.java b/freemarker-test/src/test/java/freemarker/core/DummyOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/DummyOutputFormat.java
rename to freemarker-test/src/test/java/freemarker/core/DummyOutputFormat.java
diff --git a/src/test/java/freemarker/core/EncodingOverrideTest.java b/freemarker-test/src/test/java/freemarker/core/EncodingOverrideTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EncodingOverrideTest.java
rename to freemarker-test/src/test/java/freemarker/core/EncodingOverrideTest.java
diff --git a/src/test/java/freemarker/core/EndTagSyntaxTest.java b/freemarker-test/src/test/java/freemarker/core/EndTagSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EndTagSyntaxTest.java
rename to freemarker-test/src/test/java/freemarker/core/EndTagSyntaxTest.java
diff --git a/src/test/java/freemarker/core/EnvironmentCustomStateTest.java b/freemarker-test/src/test/java/freemarker/core/EnvironmentCustomStateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EnvironmentCustomStateTest.java
rename to freemarker-test/src/test/java/freemarker/core/EnvironmentCustomStateTest.java
diff --git a/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java b/freemarker-test/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
rename to freemarker-test/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
diff --git a/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/EvalJsonBuiltInTest.java b/freemarker-test/src/test/java/freemarker/core/EvalJsonBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EvalJsonBuiltInTest.java
rename to freemarker-test/src/test/java/freemarker/core/EvalJsonBuiltInTest.java
diff --git a/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java b/freemarker-test/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
diff --git a/src/test/java/freemarker/core/FilterBiTest.java b/freemarker-test/src/test/java/freemarker/core/FilterBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/FilterBiTest.java
rename to freemarker-test/src/test/java/freemarker/core/FilterBiTest.java
diff --git a/src/test/java/freemarker/core/GetOptionalTemplateTest.java b/freemarker-test/src/test/java/freemarker/core/GetOptionalTemplateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/GetOptionalTemplateTest.java
rename to freemarker-test/src/test/java/freemarker/core/GetOptionalTemplateTest.java
diff --git a/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/HTMLOutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/HTMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/HTMLOutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/HTMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/HeaderParsingTest.java b/freemarker-test/src/test/java/freemarker/core/HeaderParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/HeaderParsingTest.java
rename to freemarker-test/src/test/java/freemarker/core/HeaderParsingTest.java
diff --git a/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java b/freemarker-test/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
rename to freemarker-test/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
diff --git a/src/test/java/freemarker/core/IncludeAndImportTest.java b/freemarker-test/src/test/java/freemarker/core/IncludeAndImportTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IncludeAndImportTest.java
rename to freemarker-test/src/test/java/freemarker/core/IncludeAndImportTest.java
diff --git a/src/test/java/freemarker/core/InterpolationSyntaxTest.java b/freemarker-test/src/test/java/freemarker/core/InterpolationSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpolationSyntaxTest.java
rename to freemarker-test/src/test/java/freemarker/core/InterpolationSyntaxTest.java
diff --git a/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java b/freemarker-test/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
rename to freemarker-test/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
diff --git a/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java b/freemarker-test/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
rename to freemarker-test/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
diff --git a/src/test/java/freemarker/core/IteratorIssuesTest.java b/freemarker-test/src/test/java/freemarker/core/IteratorIssuesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IteratorIssuesTest.java
rename to freemarker-test/src/test/java/freemarker/core/IteratorIssuesTest.java
diff --git a/src/test/java/freemarker/core/JSONParserTest.java b/freemarker-test/src/test/java/freemarker/core/JSONParserTest.java
similarity index 100%
rename from src/test/java/freemarker/core/JSONParserTest.java
rename to freemarker-test/src/test/java/freemarker/core/JSONParserTest.java
diff --git a/src/test/java/freemarker/core/LambdaParsingTest.java b/freemarker-test/src/test/java/freemarker/core/LambdaParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LambdaParsingTest.java
rename to freemarker-test/src/test/java/freemarker/core/LambdaParsingTest.java
diff --git a/src/test/java/freemarker/core/LamdaAndEscapeTest.java b/freemarker-test/src/test/java/freemarker/core/LamdaAndEscapeTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LamdaAndEscapeTest.java
rename to freemarker-test/src/test/java/freemarker/core/LamdaAndEscapeTest.java
diff --git a/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java b/freemarker-test/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
rename to freemarker-test/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
diff --git a/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java b/freemarker-test/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
rename to freemarker-test/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
diff --git a/src/test/java/freemarker/core/ListBreakContinueTest.java b/freemarker-test/src/test/java/freemarker/core/ListBreakContinueTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListBreakContinueTest.java
rename to freemarker-test/src/test/java/freemarker/core/ListBreakContinueTest.java
diff --git a/src/test/java/freemarker/core/ListErrorsTest.java b/freemarker-test/src/test/java/freemarker/core/ListErrorsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListErrorsTest.java
rename to freemarker-test/src/test/java/freemarker/core/ListErrorsTest.java
diff --git a/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java b/freemarker-test/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
rename to freemarker-test/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
diff --git a/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/MapBiTest.java b/freemarker-test/src/test/java/freemarker/core/MapBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/MapBiTest.java
rename to freemarker-test/src/test/java/freemarker/core/MapBiTest.java
diff --git a/src/test/java/freemarker/core/MinMaxBITest.java b/freemarker-test/src/test/java/freemarker/core/MinMaxBITest.java
similarity index 100%
rename from src/test/java/freemarker/core/MinMaxBITest.java
rename to freemarker-test/src/test/java/freemarker/core/MinMaxBITest.java
diff --git a/src/test/java/freemarker/core/MiscErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/core/MiscErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/MiscErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/core/MiscErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/NullTransparencyTest.java b/freemarker-test/src/test/java/freemarker/core/NullTransparencyTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NullTransparencyTest.java
rename to freemarker-test/src/test/java/freemarker/core/NullTransparencyTest.java
diff --git a/src/test/java/freemarker/core/NumberBiTest.java b/freemarker-test/src/test/java/freemarker/core/NumberBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NumberBiTest.java
rename to freemarker-test/src/test/java/freemarker/core/NumberBiTest.java
diff --git a/src/test/java/freemarker/core/NumberFormatTest.java b/freemarker-test/src/test/java/freemarker/core/NumberFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NumberFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/NumberFormatTest.java
diff --git a/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java b/freemarker-test/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
rename to freemarker-test/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
diff --git a/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java b/freemarker-test/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
similarity index 100%
rename from src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
rename to freemarker-test/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
diff --git a/src/test/java/freemarker/core/OutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/OutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/OutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/OutputFormatTest.java
diff --git a/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/ParsingErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/core/ParsingErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ParsingErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/core/ParsingErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java b/freemarker-test/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/RTFOutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/RTFOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/RTFOutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/RTFOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/SQLTimeZoneTest.java b/freemarker-test/src/test/java/freemarker/core/SQLTimeZoneTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SQLTimeZoneTest.java
rename to freemarker-test/src/test/java/freemarker/core/SQLTimeZoneTest.java
diff --git a/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java b/freemarker-test/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
rename to freemarker-test/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
diff --git a/src/test/java/freemarker/core/SequenceBuiltInTest.java b/freemarker-test/src/test/java/freemarker/core/SequenceBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SequenceBuiltInTest.java
rename to freemarker-test/src/test/java/freemarker/core/SequenceBuiltInTest.java
diff --git a/src/test/java/freemarker/core/SettingDirectiveTest.java b/freemarker-test/src/test/java/freemarker/core/SettingDirectiveTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SettingDirectiveTest.java
rename to freemarker-test/src/test/java/freemarker/core/SettingDirectiveTest.java
diff --git a/src/test/java/freemarker/core/SpecialVariableTest.java b/freemarker-test/src/test/java/freemarker/core/SpecialVariableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SpecialVariableTest.java
rename to freemarker-test/src/test/java/freemarker/core/SpecialVariableTest.java
diff --git a/src/test/java/freemarker/core/StringLiteralInterpolationTest.java b/freemarker-test/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
similarity index 100%
rename from src/test/java/freemarker/core/StringLiteralInterpolationTest.java
rename to freemarker-test/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
diff --git a/src/test/java/freemarker/core/TabSizeTest.java b/freemarker-test/src/test/java/freemarker/core/TabSizeTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TabSizeTest.java
rename to freemarker-test/src/test/java/freemarker/core/TabSizeTest.java
diff --git a/src/test/java/freemarker/core/TagSyntaxVariationsTest.java b/freemarker-test/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TagSyntaxVariationsTest.java
rename to freemarker-test/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
diff --git a/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java b/freemarker-test/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
rename to freemarker-test/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
diff --git a/src/test/java/freemarker/core/TemplatGetEncodingTest.java b/freemarker-test/src/test/java/freemarker/core/TemplatGetEncodingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplatGetEncodingTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplatGetEncodingTest.java
diff --git a/src/test/java/freemarker/core/TemplateConfigurationTest.java b/freemarker-test/src/test/java/freemarker/core/TemplateConfigurationTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateConfigurationTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateConfigurationTest.java
diff --git a/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java b/freemarker-test/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
diff --git a/src/test/java/freemarker/core/TemplateDummyOutputModel.java b/freemarker-test/src/test/java/freemarker/core/TemplateDummyOutputModel.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateDummyOutputModel.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateDummyOutputModel.java
diff --git a/src/test/java/freemarker/core/TemplateLevelSettings.java b/freemarker-test/src/test/java/freemarker/core/TemplateLevelSettings.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateLevelSettings.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateLevelSettings.java
diff --git a/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java b/freemarker-test/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
diff --git a/src/test/java/freemarker/core/TemplateProcessingTracerTest.java b/freemarker-test/src/test/java/freemarker/core/TemplateProcessingTracerTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateProcessingTracerTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateProcessingTracerTest.java
diff --git a/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java b/freemarker-test/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
diff --git a/src/test/java/freemarker/core/TemplateTransformModelTest.java b/freemarker-test/src/test/java/freemarker/core/TemplateTransformModelTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateTransformModelTest.java
rename to freemarker-test/src/test/java/freemarker/core/TemplateTransformModelTest.java
diff --git a/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java b/freemarker-test/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
rename to freemarker-test/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
diff --git a/src/test/java/freemarker/core/TruncateBuiltInTest.java b/freemarker-test/src/test/java/freemarker/core/TruncateBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TruncateBuiltInTest.java
rename to freemarker-test/src/test/java/freemarker/core/TruncateBuiltInTest.java
diff --git a/src/test/java/freemarker/core/TypeErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/core/TypeErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TypeErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/core/TypeErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java b/freemarker-test/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
rename to freemarker-test/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
diff --git a/src/test/java/freemarker/core/UnclosedCommentTest.java b/freemarker-test/src/test/java/freemarker/core/UnclosedCommentTest.java
similarity index 100%
rename from src/test/java/freemarker/core/UnclosedCommentTest.java
rename to freemarker-test/src/test/java/freemarker/core/UnclosedCommentTest.java
diff --git a/src/test/java/freemarker/core/WhitespaceStrippingTest.java b/freemarker-test/src/test/java/freemarker/core/WhitespaceStrippingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/WhitespaceStrippingTest.java
rename to freemarker-test/src/test/java/freemarker/core/WhitespaceStrippingTest.java
diff --git a/src/test/java/freemarker/core/WithArgsBuiltInTest.java b/freemarker-test/src/test/java/freemarker/core/WithArgsBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/WithArgsBuiltInTest.java
rename to freemarker-test/src/test/java/freemarker/core/WithArgsBuiltInTest.java
diff --git a/src/test/java/freemarker/core/XHTMLOutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/XHTMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/XHTMLOutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/XHTMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/XMLOutputFormatTest.java b/freemarker-test/src/test/java/freemarker/core/XMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/XMLOutputFormatTest.java
rename to freemarker-test/src/test/java/freemarker/core/XMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicAll.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PublicAll.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicAll.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PublicAll.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java b/freemarker-test/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
rename to freemarker-test/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
diff --git a/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
diff --git a/src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java b/freemarker-test/src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
diff --git a/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java b/freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
diff --git a/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java b/freemarker-test/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
diff --git a/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java b/freemarker-test/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java b/freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
diff --git a/src/test/java/freemarker/ext/beans/EnumModelsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/EnumModelsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/EnumModelsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/EnumModelsTest.java
diff --git a/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
diff --git a/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
diff --git a/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
diff --git a/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java b/freemarker-test/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
diff --git a/src/test/java/freemarker/ext/beans/IsApplicableTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/IsApplicableTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/IsApplicableTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/IsApplicableTest.java
diff --git a/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
diff --git a/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
diff --git a/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
diff --git a/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
diff --git a/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java b/freemarker-test/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
diff --git a/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java b/freemarker-test/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
diff --git a/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
diff --git a/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodMatcherTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/MethodMatcherTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodMatcherTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MethodMatcherTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodUtilTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/MethodUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodUtilTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MethodUtilTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodUtilTest2.java b/freemarker-test/src/test/java/freemarker/ext/beans/MethodUtilTest2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodUtilTest2.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MethodUtilTest2.java
diff --git a/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
diff --git a/src/test/java/freemarker/ext/beans/ModelCacheTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/ModelCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ModelCacheTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/ModelCacheTest.java
diff --git a/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
diff --git a/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
diff --git a/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
diff --git a/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
diff --git a/src/test/java/freemarker/ext/beans/RationalNumber.java b/freemarker-test/src/test/java/freemarker/ext/beans/RationalNumber.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/RationalNumber.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/RationalNumber.java
diff --git a/src/test/java/freemarker/ext/beans/StaticModelsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/StaticModelsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/StaticModelsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/StaticModelsTest.java
diff --git a/src/test/java/freemarker/ext/beans/TypeFlagsTest.java b/freemarker-test/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/TypeFlagsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
diff --git a/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java b/freemarker-test/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
rename to freemarker-test/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
diff --git a/src/test/java/freemarker/ext/dom/DOMSiblingTest.java b/freemarker-test/src/test/java/freemarker/ext/dom/DOMSiblingTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMSiblingTest.java
rename to freemarker-test/src/test/java/freemarker/ext/dom/DOMSiblingTest.java
diff --git a/src/test/java/freemarker/ext/dom/DOMTest.java b/freemarker-test/src/test/java/freemarker/ext/dom/DOMTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMTest.java
rename to freemarker-test/src/test/java/freemarker/ext/dom/DOMTest.java
diff --git a/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java b/freemarker-test/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
diff --git a/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java b/freemarker-test/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
diff --git a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/freemarker-test/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
diff --git a/src/test/java/freemarker/ext/jsp/TLDParsingTest.java b/freemarker-test/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/TLDParsingTest.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
diff --git a/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java b/freemarker-test/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java b/freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
diff --git a/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java b/freemarker-test/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
rename to freemarker-test/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
diff --git a/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java b/freemarker-test/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
rename to freemarker-test/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
diff --git a/src/test/java/freemarker/ext/servlet/InitParamParserTest.java b/freemarker-test/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/servlet/InitParamParserTest.java
rename to freemarker-test/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
diff --git a/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java b/freemarker-test/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
rename to freemarker-test/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
diff --git a/src/test/java/freemarker/manual/AutoEscapingExample.java b/freemarker-test/src/test/java/freemarker/manual/AutoEscapingExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/AutoEscapingExample.java
rename to freemarker-test/src/test/java/freemarker/manual/AutoEscapingExample.java
diff --git a/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java b/freemarker-test/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
rename to freemarker-test/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
diff --git a/src/test/java/freemarker/manual/CustomFormatsExample.java b/freemarker-test/src/test/java/freemarker/manual/CustomFormatsExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/CustomFormatsExample.java
rename to freemarker-test/src/test/java/freemarker/manual/CustomFormatsExample.java
diff --git a/src/test/java/freemarker/manual/ExamplesTest.java b/freemarker-test/src/test/java/freemarker/manual/ExamplesTest.java
similarity index 100%
rename from src/test/java/freemarker/manual/ExamplesTest.java
rename to freemarker-test/src/test/java/freemarker/manual/ExamplesTest.java
diff --git a/src/test/java/freemarker/manual/GettingStartedExample.java b/freemarker-test/src/test/java/freemarker/manual/GettingStartedExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/GettingStartedExample.java
rename to freemarker-test/src/test/java/freemarker/manual/GettingStartedExample.java
diff --git a/src/test/java/freemarker/manual/Product.java b/freemarker-test/src/test/java/freemarker/manual/Product.java
similarity index 100%
rename from src/test/java/freemarker/manual/Product.java
rename to freemarker-test/src/test/java/freemarker/manual/Product.java
diff --git a/src/test/java/freemarker/manual/TemplateConfigurationExamples.java b/freemarker-test/src/test/java/freemarker/manual/TemplateConfigurationExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/TemplateConfigurationExamples.java
rename to freemarker-test/src/test/java/freemarker/manual/TemplateConfigurationExamples.java
diff --git a/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java b/freemarker-test/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
rename to freemarker-test/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java b/freemarker-test/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
similarity index 100%
rename from src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
rename to freemarker-test/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
diff --git a/src/test/java/freemarker/manual/WithArgsExamples.java b/freemarker-test/src/test/java/freemarker/manual/WithArgsExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/WithArgsExamples.java
rename to freemarker-test/src/test/java/freemarker/manual/WithArgsExamples.java
diff --git a/src/test/java/freemarker/manual/WithArgsLastExamples.java b/freemarker-test/src/test/java/freemarker/manual/WithArgsLastExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/WithArgsLastExamples.java
rename to freemarker-test/src/test/java/freemarker/manual/WithArgsLastExamples.java
diff --git a/src/test/java/freemarker/template/ActualNamingConvetionTest.java b/freemarker-test/src/test/java/freemarker/template/ActualNamingConvetionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ActualNamingConvetionTest.java
rename to freemarker-test/src/test/java/freemarker/template/ActualNamingConvetionTest.java
diff --git a/src/test/java/freemarker/template/ActualTagSyntaxTest.java b/freemarker-test/src/test/java/freemarker/template/ActualTagSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ActualTagSyntaxTest.java
rename to freemarker-test/src/test/java/freemarker/template/ActualTagSyntaxTest.java
diff --git a/src/test/java/freemarker/template/ConfigurationTest.java b/freemarker-test/src/test/java/freemarker/template/ConfigurationTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ConfigurationTest.java
rename to freemarker-test/src/test/java/freemarker/template/ConfigurationTest.java
diff --git a/src/test/java/freemarker/template/CustomAttributeTest.java b/freemarker-test/src/test/java/freemarker/template/CustomAttributeTest.java
similarity index 100%
rename from src/test/java/freemarker/template/CustomAttributeTest.java
rename to freemarker-test/src/test/java/freemarker/template/CustomAttributeTest.java
diff --git a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java b/freemarker-test/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/template/DefaultObjectWrapperTest.java
rename to freemarker-test/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
diff --git a/src/test/java/freemarker/template/ExceptionTest.java b/freemarker-test/src/test/java/freemarker/template/ExceptionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ExceptionTest.java
rename to freemarker-test/src/test/java/freemarker/template/ExceptionTest.java
diff --git a/src/test/java/freemarker/template/GetSourceTest.java b/freemarker-test/src/test/java/freemarker/template/GetSourceTest.java
similarity index 100%
rename from src/test/java/freemarker/template/GetSourceTest.java
rename to freemarker-test/src/test/java/freemarker/template/GetSourceTest.java
diff --git a/src/test/java/freemarker/template/IncudeFromNamelessTest.java b/freemarker-test/src/test/java/freemarker/template/IncudeFromNamelessTest.java
similarity index 100%
rename from src/test/java/freemarker/template/IncudeFromNamelessTest.java
rename to freemarker-test/src/test/java/freemarker/template/IncudeFromNamelessTest.java
diff --git a/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java b/freemarker-test/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
similarity index 100%
rename from src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
rename to freemarker-test/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
diff --git a/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java b/freemarker-test/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
rename to freemarker-test/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
diff --git a/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java b/freemarker-test/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
rename to freemarker-test/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
diff --git a/src/test/java/freemarker/template/MockServletContext.java b/freemarker-test/src/test/java/freemarker/template/MockServletContext.java
similarity index 100%
rename from src/test/java/freemarker/template/MockServletContext.java
rename to freemarker-test/src/test/java/freemarker/template/MockServletContext.java
diff --git a/src/test/java/freemarker/template/NullConfigurationTest.java b/freemarker-test/src/test/java/freemarker/template/NullConfigurationTest.java
similarity index 100%
rename from src/test/java/freemarker/template/NullConfigurationTest.java
rename to freemarker-test/src/test/java/freemarker/template/NullConfigurationTest.java
diff --git a/src/test/java/freemarker/template/SimpleObjectWrapperTest.java b/freemarker-test/src/test/java/freemarker/template/SimpleObjectWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/template/SimpleObjectWrapperTest.java
rename to freemarker-test/src/test/java/freemarker/template/SimpleObjectWrapperTest.java
diff --git a/src/test/java/freemarker/template/StaticObjectWrappersTest.java b/freemarker-test/src/test/java/freemarker/template/StaticObjectWrappersTest.java
similarity index 100%
rename from src/test/java/freemarker/template/StaticObjectWrappersTest.java
rename to freemarker-test/src/test/java/freemarker/template/StaticObjectWrappersTest.java
diff --git a/src/test/java/freemarker/template/TemplateConstructorsTest.java b/freemarker-test/src/test/java/freemarker/template/TemplateConstructorsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateConstructorsTest.java
rename to freemarker-test/src/test/java/freemarker/template/TemplateConstructorsTest.java
diff --git a/src/test/java/freemarker/template/TemplateLanguageVersionTest.java b/freemarker-test/src/test/java/freemarker/template/TemplateLanguageVersionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateLanguageVersionTest.java
rename to freemarker-test/src/test/java/freemarker/template/TemplateLanguageVersionTest.java
diff --git a/src/test/java/freemarker/template/TemplateLookupStrategyTest.java b/freemarker-test/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateLookupStrategyTest.java
rename to freemarker-test/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
diff --git a/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java b/freemarker-test/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
rename to freemarker-test/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
diff --git a/src/test/java/freemarker/template/VersionTest.java b/freemarker-test/src/test/java/freemarker/template/VersionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/VersionTest.java
rename to freemarker-test/src/test/java/freemarker/template/VersionTest.java
diff --git a/src/test/java/freemarker/template/utility/ConstantsTest.java b/freemarker-test/src/test/java/freemarker/template/utility/ConstantsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/ConstantsTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/ConstantsTest.java
diff --git a/src/test/java/freemarker/template/utility/DateUtilTest.java b/freemarker-test/src/test/java/freemarker/template/utility/DateUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/DateUtilTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/DateUtilTest.java
diff --git a/src/test/java/freemarker/template/utility/DeepUnwrapTest.java b/freemarker-test/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/DeepUnwrapTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
diff --git a/src/test/java/freemarker/template/utility/NumberUtilTest.java b/freemarker-test/src/test/java/freemarker/template/utility/NumberUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/NumberUtilTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/NumberUtilTest.java
diff --git a/src/test/java/freemarker/template/utility/StringUtilTest.java b/freemarker-test/src/test/java/freemarker/template/utility/StringUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/StringUtilTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/StringUtilTest.java
diff --git a/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java b/freemarker-test/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
rename to freemarker-test/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
diff --git a/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java b/freemarker-test/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
similarity index 100%
rename from src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
rename to freemarker-test/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
diff --git a/src/test/java/freemarker/test/MonitoredTemplateLoader.java b/freemarker-test/src/test/java/freemarker/test/MonitoredTemplateLoader.java
similarity index 100%
rename from src/test/java/freemarker/test/MonitoredTemplateLoader.java
rename to freemarker-test/src/test/java/freemarker/test/MonitoredTemplateLoader.java
diff --git a/src/test/java/freemarker/test/ResourcesExtractor.java b/freemarker-test/src/test/java/freemarker/test/ResourcesExtractor.java
similarity index 100%
rename from src/test/java/freemarker/test/ResourcesExtractor.java
rename to freemarker-test/src/test/java/freemarker/test/ResourcesExtractor.java
diff --git a/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java b/freemarker-test/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
similarity index 100%
rename from src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
rename to freemarker-test/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
diff --git a/src/test/java/freemarker/test/TemplateTest.java b/freemarker-test/src/test/java/freemarker/test/TemplateTest.java
similarity index 100%
rename from src/test/java/freemarker/test/TemplateTest.java
rename to freemarker-test/src/test/java/freemarker/test/TemplateTest.java
diff --git a/src/test/java/freemarker/test/TreeView.java b/freemarker-test/src/test/java/freemarker/test/TreeView.java
similarity index 100%
rename from src/test/java/freemarker/test/TreeView.java
rename to freemarker-test/src/test/java/freemarker/test/TreeView.java
diff --git a/src/test/java/freemarker/test/hamcerst/Matchers.java b/freemarker-test/src/test/java/freemarker/test/hamcerst/Matchers.java
similarity index 100%
rename from src/test/java/freemarker/test/hamcerst/Matchers.java
rename to freemarker-test/src/test/java/freemarker/test/hamcerst/Matchers.java
diff --git a/src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java b/freemarker-test/src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
similarity index 100%
rename from src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
rename to freemarker-test/src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
diff --git a/src/test/java/freemarker/test/package.html b/freemarker-test/src/test/java/freemarker/test/package.html
similarity index 100%
rename from src/test/java/freemarker/test/package.html
rename to freemarker-test/src/test/java/freemarker/test/package.html
diff --git a/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java b/freemarker-test/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
rename to freemarker-test/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
diff --git a/src/test/java/freemarker/test/servlet/Model2Action.java b/freemarker-test/src/test/java/freemarker/test/servlet/Model2Action.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/Model2Action.java
rename to freemarker-test/src/test/java/freemarker/test/servlet/Model2Action.java
diff --git a/src/test/java/freemarker/test/servlet/Model2TesterServlet.java b/freemarker-test/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/Model2TesterServlet.java
rename to freemarker-test/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
diff --git a/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/freemarker-test/src/test/java/freemarker/test/servlet/WebAppTestCase.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/WebAppTestCase.java
rename to freemarker-test/src/test/java/freemarker/test/servlet/WebAppTestCase.java
diff --git a/src/test/java/freemarker/test/servlet/web.xml b/freemarker-test/src/test/java/freemarker/test/servlet/web.xml
similarity index 100%
rename from src/test/java/freemarker/test/servlet/web.xml
rename to freemarker-test/src/test/java/freemarker/test/servlet/web.xml
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanList1.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanList1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanList1.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanList1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanList2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanList2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanList2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanList2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/LegacyList.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/LegacyList.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/LegacyList.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/LegacyList.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/Listables.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/Listables.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/Listables.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/Listables.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel1.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel1.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel3.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel3.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel3.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel3.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel4.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel4.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel4.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel4.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel5.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel5.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel5.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/MultiModel5.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NewTestModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/NewTestModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NewTestModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/NewTestModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformModel1.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformModel1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformModel1.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/TransformModel1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java b/freemarker-test/src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/package.html b/freemarker-test/src/test/java/freemarker/test/templatesuite/package.html
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/package.html
rename to freemarker-test/src/test/java/freemarker/test/templatesuite/package.html
diff --git a/src/test/java/freemarker/test/utility/AssertDirective.java b/freemarker-test/src/test/java/freemarker/test/utility/AssertDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertDirective.java
rename to freemarker-test/src/test/java/freemarker/test/utility/AssertDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertEqualsDirective.java b/freemarker-test/src/test/java/freemarker/test/utility/AssertEqualsDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertEqualsDirective.java
rename to freemarker-test/src/test/java/freemarker/test/utility/AssertEqualsDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertFailsDirective.java b/freemarker-test/src/test/java/freemarker/test/utility/AssertFailsDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertFailsDirective.java
rename to freemarker-test/src/test/java/freemarker/test/utility/AssertFailsDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java b/freemarker-test/src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java
rename to freemarker-test/src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java
diff --git a/src/test/java/freemarker/test/utility/BadParameterTypeException.java b/freemarker-test/src/test/java/freemarker/test/utility/BadParameterTypeException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/BadParameterTypeException.java
rename to freemarker-test/src/test/java/freemarker/test/utility/BadParameterTypeException.java
diff --git a/src/test/java/freemarker/test/utility/FileTestCase.java b/freemarker-test/src/test/java/freemarker/test/utility/FileTestCase.java
similarity index 94%
rename from src/test/java/freemarker/test/utility/FileTestCase.java
rename to freemarker-test/src/test/java/freemarker/test/utility/FileTestCase.java
index 8f4fc75..c35b4c5 100644
--- a/src/test/java/freemarker/test/utility/FileTestCase.java
+++ b/freemarker-test/src/test/java/freemarker/test/utility/FileTestCase.java
@@ -134,12 +134,20 @@
     }
 
     @SuppressFBWarnings(value="UI_INHERITANCE_UNSAFE_GETRESOURCE", justification="By design relative to subclass")
-    protected final File getTestClassDirectory() throws IOException {
+    private File getTestClassDirectoryLegacy() throws IOException {
         URL url = this.getClass().getResource(".");
         if (url == null) throw new IOException("Couldn't get resource URL for \".\"");
         return new File(url.getFile());
     }
 
+    protected final File getTestClassDirectory() throws IOException {
+        String rootStr = System.getProperty("freemarker.test.resourcesDir");
+        if (rootStr == null) {
+            return getTestClassDirectoryLegacy();
+        }
+        return new File(rootStr, getClass().getPackage().getName().replace('.', File.separatorChar));
+    }
+
     protected String loadFile(File f) throws FileNotFoundException, IOException {
         return TestUtil.removeTxtCopyrightComment(loadFile(f, getDefaultCharset()));
     }
diff --git a/src/test/java/freemarker/test/utility/MissingRequiredParameterException.java b/freemarker-test/src/test/java/freemarker/test/utility/MissingRequiredParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/MissingRequiredParameterException.java
rename to freemarker-test/src/test/java/freemarker/test/utility/MissingRequiredParameterException.java
diff --git a/src/test/java/freemarker/test/utility/NoOutputDirective.java b/freemarker-test/src/test/java/freemarker/test/utility/NoOutputDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/NoOutputDirective.java
rename to freemarker-test/src/test/java/freemarker/test/utility/NoOutputDirective.java
diff --git a/src/test/java/freemarker/test/utility/ParameterException.java b/freemarker-test/src/test/java/freemarker/test/utility/ParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/ParameterException.java
rename to freemarker-test/src/test/java/freemarker/test/utility/ParameterException.java
diff --git a/src/test/java/freemarker/test/utility/TestUtil.java b/freemarker-test/src/test/java/freemarker/test/utility/TestUtil.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/TestUtil.java
rename to freemarker-test/src/test/java/freemarker/test/utility/TestUtil.java
diff --git a/src/test/java/freemarker/test/utility/UnsupportedParameterException.java b/freemarker-test/src/test/java/freemarker/test/utility/UnsupportedParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/UnsupportedParameterException.java
rename to freemarker-test/src/test/java/freemarker/test/utility/UnsupportedParameterException.java
diff --git a/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld b/freemarker-test/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
similarity index 100%
rename from src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
rename to freemarker-test/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
diff --git a/src/test/resources/freemarker/cache/test.ftl b/freemarker-test/src/test/resources/freemarker/cache/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/cache/test.ftl
rename to freemarker-test/src/test/resources/freemarker/cache/test.ftl
diff --git a/src/test/resources/freemarker/core/ast-1.ast b/freemarker-test/src/test/resources/freemarker/core/ast-1.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-1.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-1.ast
diff --git a/src/test/resources/freemarker/core/ast-1.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-1.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-1.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-1.ftl
diff --git a/src/test/resources/freemarker/core/ast-assignments.ast b/freemarker-test/src/test/resources/freemarker/core/ast-assignments.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-assignments.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-assignments.ast
diff --git a/src/test/resources/freemarker/core/ast-assignments.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-assignments.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-assignments.ftl
diff --git a/src/test/resources/freemarker/core/ast-builtins.ast b/freemarker-test/src/test/resources/freemarker/core/ast-builtins.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-builtins.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-builtins.ast
diff --git a/src/test/resources/freemarker/core/ast-builtins.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-builtins.ftl
diff --git a/src/test/resources/freemarker/core/ast-lambda.ast b/freemarker-test/src/test/resources/freemarker/core/ast-lambda.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-lambda.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-lambda.ast
diff --git a/src/test/resources/freemarker/core/ast-lambda.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-lambda.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-lambda.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-lambda.ftl
diff --git a/src/test/resources/freemarker/core/ast-locations.ast b/freemarker-test/src/test/resources/freemarker/core/ast-locations.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-locations.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-locations.ast
diff --git a/src/test/resources/freemarker/core/ast-locations.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-locations.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-locations.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-locations.ftl
diff --git a/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast b/freemarker-test/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
diff --git a/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
diff --git a/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast b/freemarker-test/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
diff --git a/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
diff --git a/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast b/freemarker-test/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
diff --git a/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
diff --git a/src/test/resources/freemarker/core/ast-range.ast b/freemarker-test/src/test/resources/freemarker/core/ast-range.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-range.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-range.ast
diff --git a/src/test/resources/freemarker/core/ast-range.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-range.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-range.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-range.ftl
diff --git a/src/test/resources/freemarker/core/ast-strlitinterpolation.ast b/freemarker-test/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-strlitinterpolation.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
diff --git a/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
diff --git a/src/test/resources/freemarker/core/ast-whitespacestripping.ast b/freemarker-test/src/test/resources/freemarker/core/ast-whitespacestripping.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-whitespacestripping.ast
rename to freemarker-test/src/test/resources/freemarker/core/ast-whitespacestripping.ast
diff --git a/src/test/resources/freemarker/core/ast-whitespacestripping.ftl b/freemarker-test/src/test/resources/freemarker/core/ast-whitespacestripping.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-whitespacestripping.ftl
rename to freemarker-test/src/test/resources/freemarker/core/ast-whitespacestripping.ftl
diff --git a/src/test/resources/freemarker/core/cano-assignments.ftl b/freemarker-test/src/test/resources/freemarker/core/cano-assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-assignments.ftl
rename to freemarker-test/src/test/resources/freemarker/core/cano-assignments.ftl
diff --git a/src/test/resources/freemarker/core/cano-assignments.ftl.out b/freemarker-test/src/test/resources/freemarker/core/cano-assignments.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-assignments.ftl.out
rename to freemarker-test/src/test/resources/freemarker/core/cano-assignments.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-builtins.ftl b/freemarker-test/src/test/resources/freemarker/core/cano-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/core/cano-builtins.ftl
diff --git a/src/test/resources/freemarker/core/cano-builtins.ftl.out b/freemarker-test/src/test/resources/freemarker/core/cano-builtins.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-builtins.ftl.out
rename to freemarker-test/src/test/resources/freemarker/core/cano-builtins.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-identifier-escaping.ftl b/freemarker-test/src/test/resources/freemarker/core/cano-identifier-escaping.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-identifier-escaping.ftl
rename to freemarker-test/src/test/resources/freemarker/core/cano-identifier-escaping.ftl
diff --git a/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out b/freemarker-test/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
rename to freemarker-test/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-macros.ftl b/freemarker-test/src/test/resources/freemarker/core/cano-macros.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-macros.ftl
rename to freemarker-test/src/test/resources/freemarker/core/cano-macros.ftl
diff --git a/src/test/resources/freemarker/core/cano-macros.ftl.out b/freemarker-test/src/test/resources/freemarker/core/cano-macros.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-macros.ftl.out
rename to freemarker-test/src/test/resources/freemarker/core/cano-macros.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl b/freemarker-test/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
rename to freemarker-test/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
diff --git a/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out b/freemarker-test/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
rename to freemarker-test/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
diff --git a/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl b/freemarker-test/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
rename to freemarker-test/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
diff --git a/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl b/freemarker-test/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
rename to freemarker-test/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
diff --git a/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml b/freemarker-test/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
rename to freemarker-test/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
diff --git a/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
diff --git a/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
diff --git a/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl b/freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
rename to freemarker-test/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
diff --git a/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl b/freemarker-test/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
diff --git a/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl b/freemarker-test/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
diff --git a/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties b/freemarker-test/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
rename to freemarker-test/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
diff --git a/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties b/freemarker-test/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
rename to freemarker-test/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out b/freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
rename to freemarker-test/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties b/freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
rename to freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties b/freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
rename to freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties b/freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
rename to freemarker-test/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
diff --git a/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl b/freemarker-test/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
diff --git a/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out b/freemarker-test/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
rename to freemarker-test/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
diff --git a/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl b/freemarker-test/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
diff --git a/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out b/freemarker-test/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
rename to freemarker-test/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl b/freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl b/freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
rename to freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out b/freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
rename to freemarker-test/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
diff --git a/src/test/resources/freemarker/manual/test.ftlh b/freemarker-test/src/test/resources/freemarker/manual/test.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/test.ftlh
rename to freemarker-test/src/test/resources/freemarker/manual/test.ftlh
diff --git a/src/test/resources/freemarker/template/toCache1.ftl b/freemarker-test/src/test/resources/freemarker/template/toCache1.ftl
similarity index 100%
rename from src/test/resources/freemarker/template/toCache1.ftl
rename to freemarker-test/src/test/resources/freemarker/template/toCache1.ftl
diff --git a/src/test/resources/freemarker/template/toCache2.ftl b/freemarker-test/src/test/resources/freemarker/template/toCache2.ftl
similarity index 100%
rename from src/test/resources/freemarker/template/toCache2.ftl
rename to freemarker-test/src/test/resources/freemarker/template/toCache2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/beans.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/beans.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/beans.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/beans.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/comment.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/comment.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/comment.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/comment.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/compress.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/compress.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/compress.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/compress.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/default.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/default.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/default.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/default.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/if.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/if.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/if.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/if.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/import.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/import.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/import.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/import.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/include.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/include.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/include.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/include.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/include2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/include2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/include2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/include2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list3.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list3.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/list3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/localization.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/localization.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/localization.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/localization.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/logging.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/logging.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/logging.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/logging.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/nested.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/nested.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/nested.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/nested.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
Binary files differ
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/recover.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/recover.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/recover.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/recover.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/root.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/root.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/root.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/root.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
Binary files differ
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/switch.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/switch.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/switch.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/switch.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/variables.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/variables.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/variables.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/variables.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xml.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt b/freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
diff --git a/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xml.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xml.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xml.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xml.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/default.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/default.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/default.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/default.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/if.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/if.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/if.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/if.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/import.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/import.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/import.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/import.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/included.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/included.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/included.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/included.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/root.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/root.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/root.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/root.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/url.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/url.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/url.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/url.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl b/freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/testcases.xml b/freemarker-test/src/test/resources/freemarker/test/templatesuite/testcases.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/testcases.xml
rename to freemarker-test/src/test/resources/freemarker/test/templatesuite/testcases.xml
diff --git a/src/test/resources/logback-test.xml b/freemarker-test/src/test/resources/logback-test.xml
similarity index 100%
rename from src/test/resources/logback-test.xml
rename to freemarker-test/src/test/resources/logback-test.xml
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..41d9927
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..00e33ed
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..1b6c787
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,234 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed 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
+#
+#      https://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.
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/ivy.xml b/ivy.xml
deleted file mode 100644
index cc573d2..0000000
--- a/ivy.xml
+++ /dev/null
@@ -1,193 +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.
--->
-
-<!--
-  AFTER CHANGING THIS FILE don't forget to issue: ant update-deps
--->
-<!DOCTYPE ivy-module [
-    <!ENTITY jetty.version "9.4.53.v20231009">
-    <!ENTITY standardTaglibs.version "1.2.5">
-    <!ENTITY slf4j.version "1.6.1">
-    <!ENTITY spring.version "2.5.6.SEC03">
-]>
-<ivy-module version="2.0">
-  <info organisation="org.freemarker" module="freemarker">
-    <license name="Apache License, Version 2.0" url="https://freemarker.apache.org/docs/app_license.html" />
-    <description homepage="https://freemarker.apache.org/">
-      FreeMarker is a &quot;template engine&quot;; a generic tool to
-      generate text output (anything from HTML to autogenerated source
-      code) based on templates.
-    </description>
-  </info>
-  <configurations>
-    <conf name="default" extends="runtime" />
-    
-    <conf name="runtime"
-        description="for using FreeMarker under J2SE 1.4+ (no optional dependencies included)"
-    />
-
-    <conf name="build.base" extends="default" visibility="private"
-        description="for building FreeMarker without dependencies that optinal dependencies"
-    />
-
-    <conf name="build.jsp2.0" extends="build.base"
-        description="for building FreeMarker with JSP 2.0 support"
-    />
-    <conf name="build.jsp2.1" extends="build.base"
-        description="for building FreeMarker with JSP 2.1 support"
-    />
-
-    <conf name="build.jython2.0" extends="build.base"
-        description="for building FreeMarker with Jython 2.0 support"
-    />
-    <conf name="build.jython2.2" extends="build.base"
-        description="for building FreeMarker with Jython 2.2 support"
-    />
-    <conf name="build.jython2.5" extends="build.base"
-        description="for building FreeMarker with Jython 2.5 support"
-    />
-    
-    <conf name="test" extends="build.jython2.5"
-        description="commons for both building and running the FreeMarker test suite"
-    />
-    <conf name="build.test" extends="test"
-        description="for building FreeMarker test suite"
-    />
-    <conf name="run.test" extends="test"
-        description="for running FreeMarker test suite"
-    />
-
-    <conf name="IDE" extends="build.test"
-        description="to be used in IDE-s (maybe with the Ivy plugin)"
-    />
-    
-    <conf name="parser" extends="default" description="for generating parser" />
-    
-    <conf name="manual" description="for generating the manual with Docgen" />
-
-    <conf name="rat" description="for generating the Rat report" />
-
-    <conf name="bnd" description="for creating OSGi bundle" />
-  </configurations>
-  <publications>
-    <artifact name="freemarker" type="jar" conf="runtime" ext="jar" />
-  </publications>
-  <dependencies>
-    <!-- build -->
-    
-    <dependency org="jaxen" name="jaxen" rev="1.0-FCS" conf="build.base->default" />
-    <dependency org="saxpath" name="saxpath" rev="1.0-FCS" conf="build.base->default" />
-    <dependency org="xalan" name="xalan" rev="2.7.0" conf="build.base->default">
-      <!-- The lowerst supported xml-apis version depends on JDK version; prevent any collision: -->
-      <exclude org="xml-apis" module="xml-apis" />
-    </dependency>
-    <dependency org="org.dom4j" name="dom4j" rev="2.1.3" conf="build.base->default" /> <!-- legacy -->
-    <dependency org="jdom" name="jdom" rev="1.0b8" conf="build.base->default" /> <!-- legacy -->
-
-    <dependency org="ant" name="ant" rev="1.6.5" conf="build.base->default">
-      <!-- The lowerst supported xml-apis version depends on JDK version; prevent any collision: -->
-      <exclude org="xml-apis" module="xml-apis" />
-    </dependency>
-    
-    <dependency org="javax.servlet.jsp" name="jsp-api" rev="2.0" conf="build.jsp2.0->default" />
-    <dependency org="javax.servlet" name="servlet-api" rev="2.4" conf="build.jsp2.0->default" />
-    <dependency org="javax.servlet.jsp" name="jsp-api" rev="2.1" conf="build.jsp2.1->default" />
-    <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="build.jsp2.1->default" />
-    
-    <dependency org="rhino" name="js" rev="1.6R1" conf="build.base->default" />
-
-    <!-- We use Jython 2.1 because there was no 2.0 in central; the relevant methods are the same. -->
-    <dependency org="jython" name="jython" rev="2.1" conf="build.jython2.0->default" />
-    <dependency org="org.python" name="jython" rev="2.2.1" conf="build.jython2.2->default" />
-    <dependency org="org.python" name="jython" rev="2.5.0" conf="build.jython2.5->default" />
-    
-    <dependency org="avalon-logkit" name="avalon-logkit" rev="2.0" conf="build.base->default" />
-    <dependency org="org.slf4j" name="slf4j-api" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="org.slf4j" name="log4j-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="build.base->default" />
-    
-    <dependency org="org.zeroturnaround" name="javarebel-sdk" rev="1.2.2" conf="build.base->default" />
-
-    <!-- Not for build.base, as @SuppressFBWarnings causes compilation warnings in dependent Gradle projects -->
-    <dependency org="com.google.code.findbugs" name="annotations" rev="3.0.0" conf="IDE->default; test->default" />
-    
-    <!--dependency org="javax.script" name="script-api" rev="1.0" conf="build.base->default" /-->
-    <!--dependency org="org.visigoths" name="cavalry" rev="1.0" conf="build.base->default" /-->
-    
-    <!-- test -->
-    
-    <!-- Note: Ant doesn't contain junit.jar any more -->
-    <dependency org="junit" name="junit" rev="4.12" conf="test->default" />
-    <dependency org="org.hamcrest" name="hamcrest-library" rev="1.3" conf="test->default" />
-
-    <dependency org="ch.qos.logback" name="logback-classic" rev="1.1.2" conf="test->default" />
-
-    <dependency org="commons-io" name="commons-io" rev="2.7" conf="test->default" />
-    <dependency org="com.google.guava" name="guava" rev="29.0-jre" conf="test->default" />
-
-    <dependency org="org.eclipse.jetty" name="jetty-server" rev="&jetty.version;" conf="test->default" />
-    <dependency org="org.eclipse.jetty" name="jetty-webapp" rev="&jetty.version;" conf="test->default" />
-    <dependency org="org.eclipse.jetty" name="jetty-util" rev="&jetty.version;" conf="test->default" />
-    <dependency org="org.eclipse.jetty" name="apache-jsp" rev="&jetty.version;" conf="test->default" />
-    <!-- JSP JSTL (not included in Jetty): -->
-    <dependency org="org.apache.taglibs" name="taglibs-standard-impl" rev="&standardTaglibs.version;" conf="test->default" />
-    <dependency org="org.apache.taglibs" name="taglibs-standard-spec" rev="&standardTaglibs.version;" conf="test->default" />
-
-    <dependency org="displaytag" name="displaytag" rev="1.2" conf="test->default">
-      <exclude org="com.lowagie" name="itext" />
-      <exclude org="org.slf4j" name="slf4j-log4j12" />
-      <exclude org="org.slf4j" name="jcl104-over-slf4j" />
-      <exclude org="log4j" name="log4j" />
-    </dependency>
-    <!-- Override Java 9 incompatible version (coming from displaytag): -->
-    <dependency org="commons-lang" name="commons-lang" rev="2.6" conf="test->default" />
-
-    <dependency org="org.springframework" name="spring-core" rev="&spring.version;" conf="test->default">
-      <exclude org="commons-logging" name="commons-logging" />
-    </dependency>
-    <dependency org="org.springframework" name="spring-test" rev="&spring.version;" conf="test->default">
-      <exclude org="commons-logging" name="commons-logging" />
-    </dependency>
-
-    <!-- docs -->
-    
-    <dependency org="org.apache.freemarker.docgen" name="freemarker-docgen-ant" rev="0.0.2-SNAPSHOT" conf="manual->default" changing="true" />
-    
-    <!-- parser -->
-    
-    <dependency org="net.java.dev.javacc" name="javacc" rev="7.0.12" conf="parser->default" />
-    
-    <!-- bnd -->
-    
-    <dependency org="biz.aQute" name="bnd" rev="1.50.0" conf="bnd->default" />
-
-    <!-- Rat -->
-    
-    <dependency org="org.apache.rat" name="apache-rat-tasks" rev="0.11" conf="rat->default" />
-
-    <!-- As the tests *run* on Ant, so it's a provided dependency there. -->
-    <exclude org="ant" module="ant" conf="run.test" />
-    
-    <!-- Ensure that JSP versions don't accidentally hide each-other -->
-    
-    <conflict org="javax.servlet.jsp" module="jsp-api" manager="strict" />
-    
-  </dependencies>
-</ivy-module>
diff --git a/ivysettings-ci.xml b/ivysettings-ci.xml
deleted file mode 100644
index 3f0dc4c..0000000
--- a/ivysettings-ci.xml
+++ /dev/null
@@ -1,34 +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.
--->
-
-<ivysettings>
-  <!-- We want this to be cacheable, so it has to be outside the project checkout directory: -->
-  <caches defaultCacheDir="${user.home}/.ivy-freemarker/cache">
-    <cache name="freemarkerCache" useOrigin="true" />
-  </caches>
-  
-  <settings defaultResolver="default" />
-  <resolvers>
-    <chain name="default">
-      <ibiblio name="mavenCentral" m2compatible="true" />
-      <ibiblio name="mavenApacheStaging" m2compatible="true" root="https://repository.apache.org/content/repositories/staging/" />
-      <ibiblio name="mavenApacheSnapshot" m2compatible="true" root="https://repository.apache.org/content/repositories/snapshots/" />
-    </chain>
-  </resolvers>
-</ivysettings>
diff --git a/ivysettings.xml b/ivysettings.xml
deleted file mode 100644
index e54516e..0000000
--- a/ivysettings.xml
+++ /dev/null
@@ -1,41 +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.
--->
-
-<ivysettings>
-  <!-- As we use our own resolved, we rather don't use the user level Ivy cache: -->
-  <caches defaultCacheDir="${ivy.project.dir}/.ivy/cache">
-    <cache name="freemarkerCache" useOrigin="true" />
-  </caches>
-  
-  <settings defaultResolver="default" />
-  <property name="localMaveRepoDir" value="${user.home}/.m2/repository/" />
-  <resolvers>
-    <chain name="default">
-      <!--
-      <filesystem name="mavenLocal" m2compatible="true">
-        <artifact pattern="${localMaveRepoDir}/[organisation]/[module]/[revision]/[module]-[revision].[ext]" />
-        <ivy pattern="${localMaveRepoDir}/[organisation]/[module]/[revision]/[module]-[revision].pom" />
-      </filesystem>
-      -->
-      <ibiblio name="mavenCentral" m2compatible="true" />
-      <ibiblio name="mavenApacheStaging" m2compatible="true" root="https://repository.apache.org/content/repositories/staging/" />
-      <ibiblio name="mavenApacheSnapshot" m2compatible="true" root="https://repository.apache.org/content/repositories/snapshots/" />
-    </chain>
-  </resolvers>
-</ivysettings>
diff --git a/osgi.bnd b/osgi.bnd
index 491eb84..f80220f 100644
--- a/osgi.bnd
+++ b/osgi.bnd
@@ -29,7 +29,7 @@
 Bundle-License: Apache License, Version 2.0; see: http://www.apache.org/licenses/LICENSE-2.0.txt
 Bundle-Vendor: freemarker.org
 
-Include-Resource: META-INF=build/classes/META-INF
+Include-Resource: META-INF=src/dist/jar/META-INF
 
 Export-Package: !freemarker.test.*, freemarker.*;version="${versionForOSGi}"
 # Important:
diff --git a/rat-excludes b/rat-excludes
index 221d104..78069ea 100644
--- a/rat-excludes
+++ b/rat-excludes
@@ -5,9 +5,9 @@
 # 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
@@ -19,24 +19,24 @@
 # --------
 
 # Generated files basically; see details in the files:
-src/manual/en_US/docgen-misc/googleAnalytics.html
-src/manual/zh_CN/docgen-misc/googleAnalytics.html
+freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
+freemarker-manual/src/main/docgen/zh_CN/docgen-misc/googleAnalytics.html
 
 # Binaries/archives created in the FreeMarker project:
 src/main/misc/overloadedNumberRules/prices.ods
-src/manual/en_US/docgen-originals/figures/overview.odg
-src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
-src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
-src/manual/en_US/favicon.png
-src/manual/en_US/figures/model2sketch.png
-src/manual/en_US/figures/overview.png
-src/manual/en_US/figures/tree.png
-src/manual/en_US/logo.png
-src/manual/zh_CN/favicon.png
-src/manual/zh_CN/figures/model2sketch.png
-src/manual/zh_CN/figures/overview.png
-src/manual/zh_CN/figures/tree.png
-src/manual/zh_CN/logo.png
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
+freemarker-manual/src/main/docgen/en_US/favicon.png
+freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
+freemarker-manual/src/main/docgen/en_US/figures/overview.png
+freemarker-manual/src/main/docgen/en_US/figures/tree.png
+freemarker-manual/src/main/docgen/en_US/logo.png
+freemarker-manual/src/main/docgen/zh_CN/favicon.png
+freemarker-manual/src/main/docgen/zh_CN/figures/model2sketch.png
+freemarker-manual/src/main/docgen/zh_CN/figures/overview.png
+freemarker-manual/src/main/docgen/zh_CN/figures/tree.png
+freemarker-manual/src/main/docgen/zh_CN/logo.png
 
 # Rat thinks it's a binary, but it's UTF-16 text:
 src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
@@ -77,4 +77,4 @@
 # -------------------------------------------
 
 README.md
-gradlew.bat
\ No newline at end of file
+gradlew.bat
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..f074a2b
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+rootProject.name = "freemarker-gae"
+
+pluginManagement {
+    repositories {
+        maven {
+            setUrl("https://repository.apache.org/content/groups/public")
+            mavenContent {
+                includeGroup("org.apache.freemarker.docgen")
+            }
+        }
+        gradlePluginPortal()
+        mavenCentral()
+    }
+}
+
+dependencyResolutionManagement {
+    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
+
+    repositories {
+        mavenCentral()
+    }
+}