diff --git a/extscript-core-root/extscript-core-java6/pom.xml b/extscript-core-root/extscript-core-java6/pom.xml
deleted file mode 100644
index 9d72898..0000000
--- a/extscript-core-root/extscript-core-java6/pom.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<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>
-    <artifactId>extscript-core-java6</artifactId>
-    <packaging>jar</packaging>
-    <name>Core java6 part</name>
-    <version>1.0.3-SNAPSHOT</version>
-
-    <description>
-        myfaces extension scripting java6 lib
-    </description>
-
-    <parent>
-        <groupId>org.apache.myfaces.extensions.scripting</groupId>
-        <artifactId>extscript-core-root</artifactId>
-        <version>1.0.3-SNAPSHOT</version>
-    </parent>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core-java6</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core-java6</developerConnection>
-        <url>http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core-java6</url>
-    </scm>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.myfaces.extensions.scripting</groupId>
-            <artifactId>extscript-core</artifactId>
-            <version>1.0.3-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-            <version>1.8.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-impl</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.5</source>
-                    <target>1.5</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-        <!--
-          - Build and install into the repository some additional artifacts that we don't
-          - want to build during normal development because they take too long.
-          -->
-        <id>generate-assembly</id>
-        <activation>
-          <property>
-            <name>performRelease</name>
-            <value>true</value>
-          </property>
-        </activation>
-        <build>
-          <plugins>
-            <plugin>
-              <!-- Install in the repository a "-javadoc.jar" file -->
-              <artifactId>maven-javadoc-plugin</artifactId>
-              <version>2.4</version>
-              <executions>
-                <execution>
-                  <id>attach-javadoc</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-            <plugin>
-              <!-- Install in the repository a "-sources.jar" file -->
-              <artifactId>maven-source-plugin</artifactId>
-              <executions>
-                <execution>
-                  <id>attach-source</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-          </plugins>
-        </build>
-      </profile>
-    </profiles>
-
-</project>
diff --git a/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/ContainerFileManager.java b/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/ContainerFileManager.java
deleted file mode 100644
index e9b731c..0000000
--- a/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/ContainerFileManager.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.loaders.java.jsr199;
-
-import org.apache.myfaces.extensions.scripting.core.util.ClassLoaderUtils;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.loaders.java.RecompiledClassLoader;
-
-import javax.tools.FileObject;
-import javax.tools.ForwardingJavaFileManager;
-import javax.tools.JavaFileObject;
-import javax.tools.StandardJavaFileManager;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * File manager, enforced by the Java Compiler API
- * which handles the source files
- *
- * @author Werner Punz (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-
-public class ContainerFileManager extends ForwardingJavaFileManager<StandardJavaFileManager> {
-
-    StandardJavaFileManager _delegate = null;
-    String _classPath = null;
-    RecompiledClassLoader classLoader = null;
-
-    public ContainerFileManager(StandardJavaFileManager standardJavaFileManager) {
-        super(standardJavaFileManager);
-        _delegate = standardJavaFileManager;
-    }
-
-    @Override
-    public JavaFileObject getJavaFileForOutput(Location location, String s, JavaFileObject.Kind kind, FileObject fileObject) throws IOException {
-        return super.getJavaFileForOutput(location, s, kind, fileObject);
-    }
-
-    @Override
-    public ClassLoader getClassLoader(Location location) {
-        return Thread.currentThread().getContextClassLoader();
-    }
-
-    public ClassLoader getClassLoader() {
-        return classLoader;
-    }
-
-    public Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) {
-        return _delegate.getJavaFileObjects(files);
-    }
-
-    public Iterable<? extends JavaFileObject> getJavaFileObjects(String... files) {
-        return _delegate.getJavaFileObjects(files);
-    }
-
-    public Iterable<? extends JavaFileObject> getJavaFileObjectsSingle(String files) {
-        return _delegate.getJavaFileObjects(files);
-    }
-
-    public String getClassPath() {
-        if (_classPath != null) {
-            return _classPath;
-        }
-
-        String retStr = ClassLoaderUtils.buildClasspath(getClassLoader(null));
-
-        return (_classPath = retStr);
-    }
-
-    public File getTempDir() {
-        return WeavingContext.getConfiguration().getCompileTarget();
-    }
-
-}
diff --git a/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/JSR199Compiler.java b/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/JSR199Compiler.java
deleted file mode 100644
index a67e3e9..0000000
--- a/extscript-core-root/extscript-core-java6/src/main/java/org/apache/myfaces/extensions/scripting/loaders/java/jsr199/JSR199Compiler.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.loaders.java.jsr199;
-
-import org.apache.myfaces.extensions.scripting.api.CompilationException;
-import org.apache.myfaces.extensions.scripting.api.CompilationResult;
-import org.apache.myfaces.extensions.scripting.api.CompilerConst;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.FileUtils;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.tools.*;
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * <p>
- * A compiler facade encapsulating the JSR 199
- * so that we can switch the implementations
- * of connecting to javac on the fly
- * </p>
- * <p>
- * This class is applied to systems which can use the JSR199 compiler
- * API. For older systems we have a javac compiler fallback and
- * probably in the long run also an eclipse as well.
- * </p>
- * <p>
- * We applied first the apache commons-jci project there, but the state
- * of the project was not where we needed it to be for our implementation
- * and fixing and changing it was more work than what was needed for this project.
- * In the dawn of the usage of JSR 199 it simply did not make any more sense
- * to use commons-jci so we rolled our own small specialized facade for this
- * </p>
- *
- * @author Werner Punz (latest modification by $Author: werpu $)
- * @version $Revision: 812255 $ $Date: 2009-09-07 20:51:39 +0200 (Mo, 07 Sep 2009) $
- */
-@SuppressWarnings("unused")
-public class JSR199Compiler implements org.apache.myfaces.extensions.scripting.api.Compiler {
-
-    JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
-    ContainerFileManager fileManager = null;
-
-    public JSR199Compiler() {
-        super();
-    }
-
-    /**
-     * Compile a single file
-     *
-     * @param sourceRoot the source search path (root of our source)
-     * @return the compilation result of the  compilation
-     * @throws CompilationException in case of a compilation error
-     * @deprecated note we will move over to a single
-     *             compile step in the beginning in the long run
-     *             we will deprecate it as soon as the full
-     *             compile at the beginning of the request
-     *             is implemented
-     *             <p/>
-     *             TODO move this code over to the weaver instead of the compiler
-     *             we do not do a single compile step anymore
-     */
-    public CompilationResult compile(File sourceRoot, File targetPath, File toCompile, ClassLoader classPathHolder) throws CompilationException {
-        fileManager = new ContainerFileManager(javaCompiler.getStandardFileManager(new DiagnosticCollector<JavaFileObject>(), null, null));
-
-        DiagnosticCollector<JavaFileObject> diagnosticCollector = new DiagnosticCollector<JavaFileObject>();
-
-        //TODO add whitelist check here
-
-        getLog().info("[EXT-SCRIPTING] Doing a full recompile");
-
-        Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects(toCompile);
-        String[] options = new String[]{CompilerConst.JC_CLASSPATH, fileManager.getClassPath(), CompilerConst.JC_TARGET_PATH, WeavingContext.getConfiguration().getCompileTarget().getAbsolutePath(), CompilerConst.JC_SOURCEPATH, sourceRoot.getAbsolutePath(), CompilerConst.JC_DEBUG};
-        javaCompiler.getTask(null, fileManager, diagnosticCollector, Arrays.asList(options), null, fileObjects).call();
-        try {
-            handleDiagnostics(diagnosticCollector);
-        } catch (ClassNotFoundException e) {
-            throw new CompilationException(e);
-        }
-        return WeavingContext.getCompilationResult(ScriptingConst.ENGINE_TYPE_JSF_JAVA);
-
-    }
-
-    /**
-     * compile all files starting from a given root
-     * <p/>
-     * note, the java compiler interface does not allow per se
-     * wildcards due to its file object indirection
-     * we deal with that problem by determine all files manually and then
-     * push the list into the jsr compiler interface
-     *
-     * @param sourceRoot the root for all java sources to be compiled
-     * @param loader     the classpath holder for the compilation
-     * @throws CompilationException in case of a compilation error
-     */
-    public CompilationResult compile(File sourceRoot, File destination, ClassLoader loader) throws CompilationException {
-        fileManager = new ContainerFileManager(javaCompiler.getStandardFileManager(new DiagnosticCollector<JavaFileObject>(), null, null));
-
-        DiagnosticCollector<JavaFileObject> diagnosticCollector = new DiagnosticCollector<JavaFileObject>();
-
-        getLog().info("[EXT-SCRIPTING] Doing a full recompile");
-
-        List<File> sourceFiles = FileUtils.fetchSourceFiles(WeavingContext.getConfiguration().getWhitelistedSourceDirs(ScriptingConst.ENGINE_TYPE_JSF_JAVA), CompilerConst.JAVA_WILDCARD);
-        for (File sourceFile : sourceFiles) {
-            if (!sourceFile.exists()) {
-                getLog().log(Level.WARNING, "[EXT-SCRIPTING] Source file with path {0} does not exist it might cause an error in the compilation process", sourceFile.getAbsolutePath());
-            }
-        }
-        Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects(sourceFiles.toArray(new File[sourceFiles.size()]));
-        String[] options = new String[]{CompilerConst.JC_CLASSPATH, fileManager.getClassPath(), CompilerConst.JC_TARGET_PATH, WeavingContext.getConfiguration().getCompileTarget().getAbsolutePath(), CompilerConst.JC_SOURCEPATH, sourceRoot.getAbsolutePath(), CompilerConst.JC_DEBUG};
-        javaCompiler.getTask(null, fileManager, diagnosticCollector, Arrays.asList(options), null, fileObjects).call();
-        try {
-            handleDiagnostics(diagnosticCollector);
-        } catch (ClassNotFoundException e) {
-            throw new CompilationException(e);
-        }
-        return WeavingContext.getCompilationResult(ScriptingConst.ENGINE_TYPE_JSF_JAVA);
-    }
-
-    /**
-     * internal diagnostics handler
-     * which just logs the errors
-     *
-     * @param diagnosticCollector the compilation results, the jsr 199 uses a DiagnosticsCollector object
-     *                            to keep the errors and warnings of the compiler
-     * @throws ClassNotFoundException in case of an error (this is enforced by the compiler interface
-     *                                and probably will be overhauled in the long run)
-     */
-    private void handleDiagnostics(DiagnosticCollector<JavaFileObject> diagnosticCollector) throws ClassNotFoundException {
-        if (diagnosticCollector.getDiagnostics().size() > 0) {
-            Logger log = Logger.getLogger(this.getClass().getName());
-            StringBuilder errors = new StringBuilder();
-            CompilationResult result = new CompilationResult("");
-            boolean hasError = false;
-            for (Diagnostic diagnostic : diagnosticCollector.getDiagnostics()) {
-                String error = createErrorMessage(diagnostic);
-                log.log(Level.WARNING, "[EXT-SCRIPTING] Compiler: {0}", error);
-
-                if (diagnostic.getKind().equals(Diagnostic.Kind.ERROR)) {
-                    hasError = true;
-                    result.getErrors().add(new CompilationResult.CompilationMessage(diagnostic.getLineNumber(), diagnostic.getMessage(Locale.getDefault())));
-                } else {
-                    result.getWarnings().add(new CompilationResult.CompilationMessage(diagnostic.getLineNumber(), diagnostic.getMessage(Locale.getDefault())));
-                }
-                errors.append(error);
-            }
-            WeavingContext.setCompilationResult(ScriptingConst.ENGINE_TYPE_JSF_JAVA, result);
-            assertErrorFound(errors, hasError);
-        } else {
-            WeavingContext.setCompilationResult(ScriptingConst.ENGINE_TYPE_JSF_JAVA, new CompilationResult(""));
-        }
-    }
-
-    /**
-     * interruption of the compile flow should only
-     * happen if an error has occurred otherwise we will proceed
-     * as expected
-     *
-     * @param errors   the errors messages found
-     * @param hasError marker if an error was found or not
-     * @throws ClassNotFoundException in case of a compile error
-     */
-    private void assertErrorFound(StringBuilder errors, boolean hasError) throws ClassNotFoundException {
-        if (hasError) {
-            throw new ClassNotFoundException("Compile error of java file:" + errors.toString());
-        }
-    }
-
-    /**
-     * creates a standardized error message
-     *
-     * @param diagnostic the diagnostic of the compiler containing the error data
-     * @return a formatted string with the standardized error message which then later
-     *         can be processed by the user
-     */
-    private String createErrorMessage(Diagnostic diagnostic) {
-        StringBuilder retVal = new StringBuilder(256);
-        if (diagnostic == null) {
-            return retVal.toString();
-        }
-        if (diagnostic.getKind().equals(Diagnostic.Kind.ERROR)) {
-            retVal.append(CompilerConst.STD_ERROR_HEAD);
-        } else if (diagnostic.getKind().equals(Diagnostic.Kind.NOTE)) {
-            retVal.append(CompilerConst.STD_NOTE_HEAD);
-        } else if (diagnostic.getKind().equals(Diagnostic.Kind.WARNING)) {
-            retVal.append(CompilerConst.STD_WARN_HEAD);
-        } else if (diagnostic.getKind().equals(Diagnostic.Kind.MANDATORY_WARNING)) {
-            retVal.append(CompilerConst.STD_MANDATORY_WARN_HEAD);
-        } else if (diagnostic.getKind().equals(Diagnostic.Kind.OTHER)) {
-            retVal.append(CompilerConst.STD_OTHER_HEAD);
-        }
-        String message = diagnostic.getMessage(Locale.getDefault());
-        message = (message == null) ? "" : message;
-        retVal.append(message);
-        retVal.append(diagnostic.getLineNumber());
-
-        retVal.append("\n\n");
-
-        String source = "No additional source info";
-
-        if (diagnostic.getSource() != null) {
-            source = diagnostic.getSource().toString();
-        }
-        retVal.append(source);
-
-        return retVal.toString();
-    }
-
-    private Logger getLog() {
-        return Logger.getLogger(this.getClass().getName());
-    }
-
-}
diff --git a/extscript-core-root/extscript-core-java6/src/test/java/org/apache/myfaces/extensions/scripting/javaloader/core/compilerTest/TestCompilerAPI.java b/extscript-core-root/extscript-core-java6/src/test/java/org/apache/myfaces/extensions/scripting/javaloader/core/compilerTest/TestCompilerAPI.java
deleted file mode 100644
index 74a20d2..0000000
--- a/extscript-core-root/extscript-core-java6/src/test/java/org/apache/myfaces/extensions/scripting/javaloader/core/compilerTest/TestCompilerAPI.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.javaloader.core.compilerTest;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.myfaces.extensions.scripting.api.Configuration;
-import org.apache.myfaces.extensions.scripting.api.DynamicCompiler;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.loaders.java.compiler.CompilerFacade;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Werner Punz (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-
-public class TestCompilerAPI {
-
-    private static final String JAVA_FILE_ENDING = ".java";
-    private static final String JSR199_COMPILER = "org.apache.myfaces.extensions.scripting.loaders.java.jsr199.JSR199Compiler";
-    private static final String JAVA5_COMPILER = "org.apache.myfaces.extensions.scripting.loaders.java.compiler.CompilerFacade";
-
-    private static final String PROBE1 = "../../src/test/resources/compiler/TestProbe1.java";
-    private static final String PROBE2 = "../../src/test/resources/compiler/TestProbe2.java";
-    private static final String RESOURCES = "../../src/test/resources/";
-
-    File probe1;
-    File probe2;
-    File root;
-
-    public TestCompilerAPI() {
-        ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        //we use a location relative to our current root one to reach the sources
-        //because the test also has to be performed outside of maven
-        //and the ide cannot cope with resource paths for now
-        String currentPath = loader.getResource("./").getPath();
-        String sourcePath1 = currentPath + PROBE1;
-        String sourcePath2 = currentPath + PROBE2;
-        String rootPath = currentPath + RESOURCES;
-
-        sourcePath1 = FilenameUtils.normalize(sourcePath1);
-        sourcePath2 = FilenameUtils.normalize(sourcePath2);
-        rootPath = FilenameUtils.normalize(rootPath);
-
-        probe1 = new File(sourcePath1);
-        probe2 = new File(sourcePath2);
-        root = new File(rootPath);
-
-        WeavingContext.setConfiguration(new Configuration());
-        WeavingContext.getConfiguration().addSourceDir(ScriptingConst.ENGINE_TYPE_JSF_JAVA, root.getAbsolutePath());
-    }
-
-    private String getScriptingFacadeClass(boolean allowJSR199) {
-        String javaVer = System.getProperty("java.version");
-        String[] versionArr = javaVer.split("\\.");
-
-        int major = Integer.parseInt(versionArr[Math.min(versionArr.length, 1)]);
-
-        if (major > 5 && allowJSR199) {
-            //jsr199 compliant jdk
-            return JSR199_COMPILER;
-        }
-        //otherwise
-        return JAVA5_COMPILER;
-    }
-
-
-    @Test
-    public void testWhiteListedCompile() {
-        //WeavingContext.getConfiguration().getWhitelistedSourceDirs(ScriptingConst.ENGINE_TYPE_JSF_JAVA).clear();
-        WeavingContext.getConfiguration().addWhitelistPackage("compiler.myPackage");
-
-        try {
-
-            DynamicCompiler compiler = (DynamicCompiler) new CompilerFacade(true);//new ReflectCompilerFacade();
-            try {
-                FileUtils.deleteDirectory(WeavingContext.getConfiguration().getCompileTarget());
-            } catch (IOException e) {
-                fail(e.getMessage());
-            }
-            WeavingContext.getConfiguration().getCompileTarget().mkdirs();
-
-            File target = compiler.compileAllFiles(root.getAbsolutePath(), "");
-
-            assertTrue("target exists files are compiled into the target", target != null);
-            File classFile1 = new File(target.getAbsolutePath() + "/compiler/TestProbe1.class");
-            File classFile2 = new File(target.getAbsolutePath() + "/compiler/TestProbe2.class");
-            File classFile3 = new File(target.getAbsolutePath() + "/compiler/myPackage/WhiteListedProbe.class");
-
-            assertTrue("Classfile_1 is not compiled into the target",    !classFile1.exists());
-            assertTrue("Classfile_2 is not compiled into the target",    !classFile2.exists());
-            assertTrue("Classfile_3 is compiled into the target",        classFile3.exists());
-
-        } catch (ClassNotFoundException e) {
-            fail(e.toString());
-        }
-
-    }
-
-
-    @Test
-    public void testFullCompile() {
-        try {
-
-            DynamicCompiler compiler = (DynamicCompiler) new CompilerFacade(true);//new ReflectCompilerFacade();
-
-            File target = compiler.compileAllFiles(root.getAbsolutePath(), "");
-
-            assertTrue("target exists files are compiled into the target", target != null);
-            File classFile1 = new File(target.getAbsolutePath() + "/compiler/TestProbe1.class");
-            File classFile2 = new File(target.getAbsolutePath() + "/compiler/TestProbe2.class");
-
-            assertTrue("Classfile1 is compiled into the target", classFile1.exists());
-            assertTrue("Classfile2 is compiled into the target", classFile2.exists());
-        } catch (ClassNotFoundException e) {
-            fail(e.toString());
-        }
-    }
-
-}
diff --git a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe1.java b/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe1.java
deleted file mode 100644
index d09e628..0000000
--- a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package compiler;
-
-/**
- * a simple testprobe to check if the compiler api works
- */
-public class TestProbe1 {
-
-}
\ No newline at end of file
diff --git a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe2.java b/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe2.java
deleted file mode 100644
index 6cc4802..0000000
--- a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/TestProbe2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package compiler;
-
-/**
- * a simple testprobe to check if the compiler api works
- */
-public class TestProbe2 {
-
-}
\ No newline at end of file
diff --git a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/myPackage/WhiteListedProbe.java b/extscript-core-root/extscript-core-java6/src/test/resources/compiler/myPackage/WhiteListedProbe.java
deleted file mode 100644
index 551bd5a..0000000
--- a/extscript-core-root/extscript-core-java6/src/test/resources/compiler/myPackage/WhiteListedProbe.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package compiler.myPackage;
-
-/**
- * White listed probe for the compiler api
- */
-public class WhiteListedProbe {
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/faces-config.NavData b/extscript-core-root/extscript-myfaces12-extensions/faces-config.NavData
deleted file mode 100644
index e69de29..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/faces-config.NavData
+++ /dev/null
diff --git a/extscript-core-root/extscript-myfaces12-extensions/pom.xml b/extscript-core-root/extscript-myfaces12-extensions/pom.xml
deleted file mode 100644
index 8a10d2e..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<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>
-    <artifactId>extscript-myfaces12-extensions</artifactId>
-    <packaging>jar</packaging>
-    <name>myfaces12-extensions</name>
-
-    <description>
-        extensions.scripting classes which enable myfaces 1.2 compatibility
-    </description>
-
-    <parent>
-        <groupId>org.apache.myfaces.extensions.scripting</groupId>
-        <artifactId>extscript-core-root</artifactId>
-        <version>1.0.3-SNAPSHOT</version>
-    </parent>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-myfaces12-extensions</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-myfaces12-extensions</developerConnection>
-        <url>http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-myfaces12-extensions</url>
-    </scm>
-
-    <dependencies>
-
-
-        <dependency>
-            <groupId>org.apache.myfaces.extensions.scripting</groupId>
-            <artifactId>extscript-core</artifactId>
-            <version>1.0.3-SNAPSHOT</version>
-        </dependency>
-
-
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-impl</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.facelets</groupId>
-            <artifactId>jsf-facelets</artifactId>
-            <version>1.1.11</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-            <version>1.8.0</version>
-        </dependency>
-
-       
-    </dependencies>
-
-    <profiles>
-        <profile>
-        <!--
-          - Build and install into the repository some additional artifacts that we don't
-          - want to build during normal development because they take too long.
-          -->
-        <id>generate-assembly</id>
-        <activation>
-          <property>
-            <name>performRelease</name>
-            <value>true</value>
-          </property>
-        </activation>
-        <build>
-          <plugins>
-            <plugin>
-              <!-- Install in the repository a "-javadoc.jar" file -->
-              <artifactId>maven-javadoc-plugin</artifactId>
-              <version>2.4</version>
-              <executions>
-                <execution>
-                  <id>attach-javadoc</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-            <plugin>
-              <!-- Install in the repository a "-sources.jar" file -->
-              <artifactId>maven-source-plugin</artifactId>
-              <executions>
-                <execution>
-                  <id>attach-source</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-          </plugins>
-        </build>
-      </profile>
-    </profiles>
-   
-</project>
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/facelet/ReroutingResourceResolver.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/facelet/ReroutingResourceResolver.java
deleted file mode 100644
index 4d856f5..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/facelet/ReroutingResourceResolver.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.facelet;
-
-import com.sun.facelets.impl.DefaultResourceResolver;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * decorated Facelet resource resolver to reroute
- * the resource requests to our source path if possible
- */
-public class ReroutingResourceResolver extends DefaultResourceResolver {
-
-    DefaultResourceResolver _delegate = new DefaultResourceResolver();
-    volatile boolean _initiated = false;
-    List<String> _resourceDirs = null;
-
-    Logger log = Logger.getLogger(this.getClass().getName());
-
-    @Override
-    public URL resolveUrl(String path) {
-
-        if (!_initiated) {
-            _resourceDirs = WeavingContext.getConfiguration().getResourceDirs();
-            _initiated = true;
-        }
-
-        if (_resourceDirs != null && !_resourceDirs.isEmpty()) {
-            for (String resourceDir : _resourceDirs) {
-                File resource = new File(resourceDir + path);
-                if (resource.exists()) try {
-                    return resource.toURI().toURL();
-                } catch (MalformedURLException e) {
-                    log.log(Level.SEVERE,"", e);
-                }
-            }
-        }
-
-        return _delegate.resolveUrl(path);
-    }
-}
-
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingApplicationFactory.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingApplicationFactory.java
deleted file mode 100644
index a56322c..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingApplicationFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories;
-
-import org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations.ApplicationProxy;
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.application.ApplicationFactory;
-import javax.faces.application.Application;
-
-/**
- * Application factory which introduces
- * scripting proxies for their artefacts
- * <p/>
- * We use a mix of AOP and helper constructs
- * to reach the goal to be dynamic.
- * For most artefacts we just need to
- * check if the object is a Groovy object
- * and then reload at their connection interfaces
- * <p/>
- * Some artefacts have a longer lifespan and/or are stateless
- * for those we have to work with reloading AOP
- *
- * @author Werner Punz
- */
-public class ScriptingApplicationFactory extends ApplicationFactory implements Decorated {
-
-    ApplicationFactory _delegate;
-    boolean scriptingEnabled = false;
-
-    public ScriptingApplicationFactory(ApplicationFactory delegate) {
-        _delegate = delegate;
-    }
-
-    public Application getApplication() {
-        Application retVal = _delegate.getApplication();
-
-        if (WeavingContext.isScriptingEnabled() && !(retVal instanceof ApplicationProxy))
-            retVal = new ApplicationProxy(retVal);
-
-        return retVal;
-    }
-
-    public void setApplication(Application application) {
-        if (WeavingContext.isScriptingEnabled() && !(application instanceof ApplicationProxy))
-            application = new ApplicationProxy(application);
-
-        _delegate.setApplication(application);
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingFacesContextFactory.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingFacesContextFactory.java
deleted file mode 100644
index c09a7df..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingFacesContextFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories;
-
-import org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations.FacesContextProxy;
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.context.FacesContext;
-import javax.faces.context.FacesContextFactory;
-import javax.faces.lifecycle.Lifecycle;
-import javax.faces.FacesException;
-
-/**
- * Faces context weaver which builds
- * our reloading proxy around the current faces context
- *
- * @author Werner Punz
- */
-public class ScriptingFacesContextFactory extends javax.faces.context.FacesContextFactory implements Decorated {
-
-    public FacesContextFactory _delegate;
-    boolean scriptingEnabled = false;
-
-    public ScriptingFacesContextFactory(FacesContextFactory delegate) {
-        _delegate = delegate;
-    }
-
-    public void setDelegate(FacesContextFactory delegate) {
-        _delegate = delegate;
-    }
-
-    public FacesContext getFacesContext(Object o, Object o1, Object o2, Lifecycle lifecycle) throws FacesException {
-        FacesContext retVal = _delegate.getFacesContext(o, o1, o2, lifecycle);
-
-        if (WeavingContext.isScriptingEnabled() && !(retVal instanceof FacesContextProxy))
-            return new FacesContextProxy(retVal);
-        return retVal;
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingLifecycleFactory.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingLifecycleFactory.java
deleted file mode 100644
index d8a1c1e..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingLifecycleFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories;
-
-import org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations.LifefcycleProxy;
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.lifecycle.LifecycleFactory;
-import javax.faces.lifecycle.Lifecycle;
-import java.util.Iterator;
-
-/**
- * Lifecyclefactory which introduces scripting proxies
- * for their artefacts
- *
- * @author Werner Punz
- */
-public class ScriptingLifecycleFactory extends LifecycleFactory implements Decorated {
-
-    LifecycleFactory _delegate;
-    boolean scriptingEnabled = false;
-
-    public ScriptingLifecycleFactory(LifecycleFactory delegate) {
-        _delegate = delegate;
-    }
-
-    public void addLifecycle(String s, Lifecycle lifecycle) {
-        if (scriptingEnabled && !(lifecycle instanceof LifefcycleProxy))
-            lifecycle = new LifefcycleProxy(lifecycle);
-        _delegate.addLifecycle(s, lifecycle);
-    }
-
-    public Lifecycle getLifecycle(String s) {
-        Lifecycle retVal = _delegate.getLifecycle(s);
-        if (WeavingContext.isScriptingEnabled() && !(retVal instanceof LifefcycleProxy))
-            retVal = new LifefcycleProxy(retVal);
-
-        return retVal;
-    }
-
-    public Iterator getLifecycleIds() {
-        return _delegate.getLifecycleIds();
-    }
-
-    public void setDelegate(LifecycleFactory delegate) {
-        this._delegate = delegate;
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingRenderkitFactory.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingRenderkitFactory.java
deleted file mode 100644
index b787ecc..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/factories/ScriptingRenderkitFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations.RenderkitProxy;
-
-import javax.faces.render.RenderKitFactory;
-import javax.faces.render.RenderKit;
-import javax.faces.context.FacesContext;
-import java.util.Iterator;
-
-/**
- * Scripting enabled renderkit factory
- *
- * @author Werner Punz
- */
-public class ScriptingRenderkitFactory extends RenderKitFactory implements Decorated {
-
-    boolean scriptingEnabled = false;
-
-    public ScriptingRenderkitFactory(RenderKitFactory delegate) {
-        _delegate = delegate;
-       
-    }
-
-    public void addRenderKit(String s, RenderKit renderKit) {
-        if (WeavingContext.isScriptingEnabled() && renderKit != null && !(renderKit instanceof RenderkitProxy))
-            renderKit = new RenderkitProxy(renderKit);
-
-        _delegate.addRenderKit(s, renderKit);
-    }
-
-    public RenderKit getRenderKit(FacesContext facesContext, String s) {
-        RenderKit retVal = _delegate.getRenderKit(facesContext, s);
-        if (WeavingContext.isScriptingEnabled() &&  retVal != null && !(retVal instanceof RenderkitProxy))
-            retVal = new RenderkitProxy(retVal);
-        return retVal;
-    }
-
-    public Iterator getRenderKitIds() {
-        return _delegate.getRenderKitIds();
-    }
-
-    public void setDelegate(RenderKitFactory delegate) {
-        _delegate = delegate;
-    }
-
-    RenderKitFactory _delegate = null;
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
deleted file mode 100644
index b4ef149..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.el.*;
-import javax.faces.FacesException;
-import javax.faces.application.Application;
-import javax.faces.application.NavigationHandler;
-import javax.faces.application.StateManager;
-import javax.faces.application.ViewHandler;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.convert.Converter;
-import javax.faces.el.*;
-import javax.faces.event.ActionListener;
-import javax.faces.validator.Validator;
-import java.lang.reflect.Proxy;
-import java.util.*;
-
-/**
- * our decorating application
- * which should resolve our bean issues within a central
- * bean processing interceptor
- * <p/>
- *
- * @author Werner Punz
- */
-@SuppressWarnings({"deprecation", "deprecation"})
-public class ApplicationProxy extends Application implements Decorated {
-
-    volatile Application _delegate;
-    volatile static boolean elResolverAdded = false;
-    volatile static boolean varResolverAdded = false;
-
-    public ApplicationProxy(Application delegate) {
-        _delegate = delegate;
-    }
-
-    public void addELResolver(ELResolver elResolver) {
-        weaveDelegate();
-        /*if (!elResolverAdded) {
-            //ordering hints are unsufficient here we make
-            //sure our proxy is added as second in the chain
-            //also this method works as well on
-            //jsf 1.2 while hints only work in jsf2
-            elResolver = new ELResolverProxy(elResolver);
-            elResolverAdded = true;
-        }*/
-        _delegate.addELResolver(elResolver);
-    }
-
-    private void weaveDelegate() {
-        if (_delegate != null) {
-            _delegate = (Application) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_APPLICATION);
-        }
-    }
-
-    public ELResolver getELResolver() {
-        weaveDelegate();
-        ELResolver retVal = _delegate.getELResolver();
-        return retVal;
-    }
-
-    //TOD add a weaving for resource bundles
-
-    public ResourceBundle getResourceBundle(FacesContext facesContext, String s) throws FacesException, NullPointerException {
-        weaveDelegate();
-        return _delegate.getResourceBundle(facesContext, s);
-    }
-
-    public UIComponent createComponent(ValueExpression valueExpression, FacesContext facesContext, String s) throws FacesException, NullPointerException {
-        weaveDelegate();
-        System.out.println("create1");
-        UIComponent component = _delegate.createComponent(valueExpression, facesContext, s);
-
-        /*we are reweaving on the fly because we cannot be sure if
-         * the class is not recycled all the time in the creation
-         * code, in the renderer we do it on method base
-         * due to the fact that our renderers are recycled via
-         * a flyweight pattern
-         *
-         *
-         * Also we cannot proxy here because there is no UIComponent interface
-         * maybe in the long run we can make a decorator here instead
-         * but for now lets try it this way
-         */
-        if (WeavingContext.isDynamic(component.getClass()) && !alreadyWovenInRequest(component.getClass().getName())) {
-            /*once it was tainted we have to recreate all the time*/
-            component = (UIComponent) WeavingContext.getWeaver().reloadScriptingInstance(component, ScriptingConst.ARTIFACT_TYPE_COMPONENT);
-            alreadyWovenInRequest(component.getClass().getName());
-        }
-        return component;
-
-    }
-
-    public ExpressionFactory getExpressionFactory() {
-        weaveDelegate();
-        return _delegate.getExpressionFactory();
-    }
-
-    public void addELContextListener(ELContextListener elContextListener) {
-        weaveDelegate();
-        if (WeavingContext.isDynamic(elContextListener.getClass()))
-            elContextListener = (ELContextListener) WeavingContext.createMethodReloadingProxyFromObject(elContextListener, ELContextListener.class, ScriptingConst.ARTIFACT_TYPE_ELCONTEXTLISTENER);
-        _delegate.addELContextListener(elContextListener);
-    }
-
-    public void removeELContextListener(ELContextListener elContextListener) {
-        weaveDelegate();
-        _delegate.removeELContextListener(elContextListener);
-    }
-
-    public ELContextListener[] getELContextListeners() {
-        weaveDelegate();
-        return _delegate.getELContextListeners();
-    }
-
-    public Object evaluateExpressionGet(FacesContext facesContext, String s, Class aClass) throws ELException {
-        weaveDelegate();
-        //good place for a dynamic reloading check as well
-        Object retVal = _delegate.evaluateExpressionGet(facesContext, s, aClass);
-        if (WeavingContext.isDynamic(retVal.getClass()))
-            retVal = WeavingContext.getWeaver().reloadScriptingInstance(retVal, ScriptingConst.ARTIFACT_TYPE_MANAGEDBEAN);
-        return retVal;
-    }
-
-    public ActionListener getActionListener() {
-        weaveDelegate();
-        ActionListener retVal = _delegate.getActionListener();
-        if (WeavingContext.isDynamic(retVal.getClass()))
-            retVal = (ActionListener) WeavingContext.createMethodReloadingProxyFromObject(retVal, ActionListener.class, ScriptingConst.ARTIFACT_TYPE_ACTIONLISTENER);
-        return retVal;
-    }
-
-    public void setActionListener(ActionListener actionListener) {
-        weaveDelegate();
-        if (WeavingContext.isDynamic(actionListener.getClass()))
-            actionListener = (ActionListener) WeavingContext.createMethodReloadingProxyFromObject(actionListener, ActionListener.class, ScriptingConst.ARTIFACT_TYPE_ACTIONLISTENER);
-        _delegate.setActionListener(actionListener);
-    }
-
-    public Locale getDefaultLocale() {
-        weaveDelegate();
-        return _delegate.getDefaultLocale();
-    }
-
-    public void setDefaultLocale(Locale locale) {
-        weaveDelegate();
-        _delegate.setDefaultLocale(locale);
-    }
-
-    public String getDefaultRenderKitId() {
-        weaveDelegate();
-        return _delegate.getDefaultRenderKitId();
-    }
-
-    public void setDefaultRenderKitId(String s) {
-        weaveDelegate();
-        _delegate.setDefaultRenderKitId(s);
-    }
-
-    public String getMessageBundle() {
-        weaveDelegate();
-        return _delegate.getMessageBundle();
-    }
-
-    public void setMessageBundle(String s) {
-        weaveDelegate();
-        _delegate.setMessageBundle(s);
-    }
-
-    public NavigationHandler getNavigationHandler() {
-        weaveDelegate();
-        //defined in the setter to speed things up a little
-        NavigationHandler retVal = _delegate.getNavigationHandler();
-        if (retVal != null && WeavingContext.isDynamic(retVal.getClass()))
-            retVal = new NavigationHandlerProxy(retVal);
-        return retVal;
-    }
-
-    public void setNavigationHandler(NavigationHandler navigationHandler) {
-        weaveDelegate();
-        if (navigationHandler != null && WeavingContext.isDynamic(navigationHandler.getClass()))
-            navigationHandler = new NavigationHandlerProxy(navigationHandler);
-        _delegate.setNavigationHandler(navigationHandler);
-    }
-
-    @SuppressWarnings("deprecation")
-    public PropertyResolver getPropertyResolver() {
-        weaveDelegate();
-        return _delegate.getPropertyResolver();
-    }
-
-    @SuppressWarnings("deprecation")
-    public void setPropertyResolver(PropertyResolver propertyResolver) {
-        weaveDelegate();
-        _delegate.setPropertyResolver(propertyResolver);
-    }
-
-    @SuppressWarnings("deprecation")
-    public VariableResolver getVariableResolver() {
-        weaveDelegate();
-        VariableResolver variableResolver = _delegate.getVariableResolver();
-        return variableResolver;
-    }
-
-    @SuppressWarnings("deprecation")
-    public void setVariableResolver(VariableResolver variableResolver) {
-        weaveDelegate();
-        if (!varResolverAdded) {
-            variableResolver = new VariableResolverProxy(variableResolver);
-            varResolverAdded = true;
-        }
-        _delegate.setVariableResolver(variableResolver);
-    }
-
-    public ViewHandler getViewHandler() {
-        weaveDelegate();
-        ViewHandler handler = _delegate.getViewHandler();
-
-        /*
-        We proxy here to emable dynamic reloading for
-        methods in the long run, as soon as we hit
-        java all our groovy reloading code is lost
-        hence we have to work with proxies here
-        */
-        if (WeavingContext.isDynamic(handler.getClass()))
-            handler = new ViewHandlerProxy(handler);
-        return handler;
-    }
-
-    public void setViewHandler(ViewHandler viewHandler) {
-        weaveDelegate();
-        /*make sure you have the delegates as well in properties*/
-        if (WeavingContext.isDynamic(viewHandler.getClass()))
-            viewHandler = new ViewHandlerProxy(viewHandler);
-
-        _delegate.setViewHandler(viewHandler);
-    }
-
-    public StateManager getStateManager() {
-        weaveDelegate();
-        return _delegate.getStateManager();
-    }
-
-    public void setStateManager(StateManager stateManager) {
-        weaveDelegate();
-        _delegate.setStateManager(stateManager);
-    }
-
-    public void addComponent(String componentType, String componentClass) {
-        weaveDelegate();
-        _delegate.addComponent(componentType, componentClass);
-    }
-
-    public UIComponent createComponent(String s) throws FacesException {
-        weaveDelegate();
-        //the components are generated anew very often
-        //we cannot do an on object weaving here
-        UIComponent component = _delegate.createComponent(s);
-
-        /*we are reweaving on the fly because we cannot be sure if
-        * the class is not recycled all the time in the creation
-        * code, in the renderer we do it on method base
-        * due to the fact that our renderers are recycled via
-        * a flyweight pattern*/
-        return (UIComponent) reloadInstance(component, ScriptingConst.ARTIFACT_TYPE_COMPONENT);
-    }
-
-    @SuppressWarnings("deprecation")
-    public UIComponent createComponent(ValueBinding valueBinding, FacesContext facesContext, String s) throws FacesException {
-        weaveDelegate();
-        UIComponent component = _delegate.createComponent(valueBinding, facesContext, s);
-
-        /*we are reweaving on the fly because we cannot be sure if
-         * the class is not recycled all the time in the creation
-         * code, in the renderer we do it on method base
-         * due to the fact that our renderers are recycled via
-         * a flyweight pattern*/
-        return (UIComponent) reloadInstance(component, ScriptingConst.ARTIFACT_TYPE_COMPONENT);
-    }
-
-    public Iterator<String> getComponentTypes() {
-        weaveDelegate();
-        return _delegate.getComponentTypes();
-    }
-
-    public void addConverter(String s, String s1) {
-        weaveDelegate();
-        _delegate.addConverter(s, s1);
-    }
-
-    public void addConverter(Class aClass, String s) {
-        weaveDelegate();
-        _delegate.addConverter(aClass, s);
-    }
-
-    public Converter createConverter(String s) {
-        weaveDelegate();
-        Converter retVal = _delegate.createConverter(s);
-        /**
-         * since createConverter is called only once
-         * we have to work with method reloading proxies
-         * we cannot use this technique extensively for speed reasons
-         * most of the time it is fine just to work with
-         *
-         * reloading objects at their interception points
-         */
-        if (WeavingContext.isDynamic(retVal.getClass())) {
-            retVal = (Converter) WeavingContext.createMethodReloadingProxyFromObject(retVal, Converter.class, ScriptingConst.ARTIFACT_TYPE_CONVERTER);
-
-        }
-
-        return retVal;
-    }
-
-    public Converter createConverter(Class aClass) {
-        weaveDelegate();
-        Converter retVal = _delegate.createConverter(aClass);
-        if (retVal != null && WeavingContext.isDynamic(retVal.getClass())) {
-            retVal = (Converter) WeavingContext.createMethodReloadingProxyFromObject(retVal, Converter.class, ScriptingConst.ARTIFACT_TYPE_CONVERTER);
-        }
-
-        return retVal;
-    }
-
-    public Iterator<String> getConverterIds() {
-        weaveDelegate();
-        return _delegate.getConverterIds();
-    }
-
-    public Iterator<Class> getConverterTypes() {
-        weaveDelegate();
-        return _delegate.getConverterTypes();
-    }
-
-    @SuppressWarnings("deprecation")
-    public MethodBinding createMethodBinding(String s, Class[] classes) throws ReferenceSyntaxException {
-        weaveDelegate();
-        return _delegate.createMethodBinding(s, classes);
-    }
-
-    public Iterator<Locale> getSupportedLocales() {
-        weaveDelegate();
-        return _delegate.getSupportedLocales();
-    }
-
-    public void setSupportedLocales(Collection<Locale> locales) {
-        weaveDelegate();
-        _delegate.setSupportedLocales(locales);
-    }
-
-    public void addValidator(String s, String s1) {
-        weaveDelegate();
-        _delegate.addValidator(s, s1);
-    }
-
-    public Validator createValidator(String s) throws FacesException {
-        weaveDelegate();
-
-        Validator retVal = _delegate.createValidator(s);
-        if (WeavingContext.isDynamic(retVal.getClass()) && !Proxy.isProxyClass(retVal.getClass())) {
-            retVal = (Validator) reloadInstance(retVal, ScriptingConst.ARTIFACT_TYPE_VALIDATOR);
-        }
-        return retVal;
-    }
-
-    public Iterator<String> getValidatorIds() {
-        weaveDelegate();
-        return _delegate.getValidatorIds();
-    }
-
-    @SuppressWarnings("deprecation")
-    public ValueBinding createValueBinding(String s) throws ReferenceSyntaxException {
-        weaveDelegate();
-        return _delegate.createValueBinding(s);
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-
-    private Object reloadInstance(Object instance, int artefactType) {
-        if (instance == null) {
-            return null;
-        }
-        if (WeavingContext.isDynamic(instance.getClass()) && !alreadyWovenInRequest(instance.getClass().getName())) {
-            instance = WeavingContext.getWeaver().reloadScriptingInstance(instance, artefactType);
-            alreadyWovenInRequest(instance.getClass().getName());
-        }
-        return instance;
-    }
-
-    private boolean alreadyWovenInRequest(String clazz) {
-        //portlets now can be enabled thanks to the jsf2 indirections regarding the external context
-        Map<String, Object> reqMap = WeavingContext.getRequestMap();
-        if (reqMap.get(ScriptingConst.SCRIPTING_REQUSINGLETON + clazz) == null) {
-            reqMap.put(ScriptingConst.SCRIPTING_REQUSINGLETON + clazz, "");
-            return false;
-        }
-        return true;
-    }
-
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java
deleted file mode 100644
index 6d6bfde..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.el.ELContext;
-import javax.el.ELException;
-import javax.el.ELResolver;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.util.Iterator;
-import java.util.logging.Logger;
-
-/**
- * EL Resolver which is scripting enabled
- *
- * @author Werner Punz
- */
-public class ELResolverProxy extends ELResolver implements Decorated {
-
-    Logger log = Logger.getLogger(ELResolverProxy.class.getName());
-    ELResolver _delegate = null;
-
-    public ELResolverProxy(ELResolver delegate) {
-        _delegate = delegate;
-    }
-
-
-    public Object getValue(ELContext elContext, final Object base, final Object property) throws NullPointerException, ELException {
-        return _delegate.getValue(elContext, base, property);
-    }
-
-    public Class<?> getType(ELContext elContext, Object base, Object property) throws NullPointerException, ELException {
-        return _delegate.getType(elContext, base, property);
-    }
-
-    public void setValue(ELContext elContext, Object base, Object property, Object value) throws NullPointerException, ELException {
-        if (base != null) {
-            WeavingContext.getRefreshContext().getDependencyRegistry().addDependency(ScriptingConst.ENGINE_TYPE_JSF_ALL, base.getClass().getName(), base.getClass().getName(), value.getClass().getName());
-        }
-        _delegate.setValue(elContext, base, property, value);
-    }
-
-    public boolean isReadOnly(ELContext elContext, Object o, Object o1) throws NullPointerException, ELException {
-        return  _delegate.isReadOnly(elContext, o, o1);
-    }
-
-    public Iterator getFeatureDescriptors(ELContext elContext, Object o) {
-        return _delegate.getFeatureDescriptors(elContext, o);
-    }
-
-    public Class<?> getCommonPropertyType(ELContext elContext, Object o) {
-        return _delegate.getCommonPropertyType(elContext, o);
-    }
-
-
-    public Object getDelegate() {
-        return _delegate;  
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/FacesContextProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/FacesContextProxy.java
deleted file mode 100644
index ba8f0a1..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/FacesContextProxy.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.context.FacesContext;
-import javax.faces.context.ExternalContext;
-import javax.faces.context.ResponseStream;
-import javax.faces.context.ResponseWriter;
-import javax.faces.application.Application;
-import javax.faces.application.FacesMessage;
-import javax.faces.render.RenderKit;
-import javax.faces.component.UIViewRoot;
-import javax.el.ELContext;
-import java.util.Iterator;
-
-/**
- * A reloading, weaving  faces context
- * this is needed because groovy fails on
- * the introspection of the standard java myfaces
- * faces context due to pending references
- * of the _impl into the portlet context
- * not sure if this works in portlets
- * though
- *
- * @author Werner Punz
- */
-public class FacesContextProxy extends FacesContext implements Decorated {
-
-    public FacesContext _delegate = null;
-
-    private void weaveDelegate() {
-        //in case of a context destroyed the weaver might be accessed a last time
-        //but is already null due to having no weaver  in the shutdown thread
-        if (_delegate != null && WeavingContext.getWeaver() != null)
-            _delegate = (FacesContext) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_FACESCONTEXT);
-    }
-
-    public ELContext getELContext() {
-        return _delegate.getELContext();
-    }
-
-    public Application getApplication() {
-        return _delegate.getApplication();
-    }
-
-    public Iterator<String> getClientIdsWithMessages() {
-        return _delegate.getClientIdsWithMessages();
-    }
-
-    public ExternalContext getExternalContext() {
-        return _delegate.getExternalContext();
-    }
-
-    public FacesMessage.Severity getMaximumSeverity() {
-        return _delegate.getMaximumSeverity();
-    }
-
-    public Iterator<FacesMessage> getMessages() {
-        return _delegate.getMessages();
-    }
-
-    public Iterator<FacesMessage> getMessages(String s) {
-        return _delegate.getMessages(s);
-    }
-
-    public RenderKit getRenderKit() {
-        return _delegate.getRenderKit();
-    }
-
-    public boolean getRenderResponse() {
-        return _delegate.getRenderResponse();
-    }
-
-    public boolean getResponseComplete() {
-        return _delegate.getResponseComplete();
-    }
-
-    public ResponseStream getResponseStream() {
-        return _delegate.getResponseStream();
-    }
-
-    public void setResponseStream(ResponseStream responseStream) {
-        _delegate.setResponseStream(responseStream);
-    }
-
-    public ResponseWriter getResponseWriter() {
-        return _delegate.getResponseWriter();
-    }
-
-    public void setResponseWriter(ResponseWriter responseWriter) {
-        _delegate.setResponseWriter(responseWriter);
-    }
-
-    public UIViewRoot getViewRoot() {
-        return _delegate.getViewRoot();
-    }
-
-    public void setViewRoot(UIViewRoot uiViewRoot) {
-        weaveDelegate();//perfect place no matter what the viewRoot is about once per request set
-        _delegate.setViewRoot(uiViewRoot);
-    }
-
-    public void addMessage(String s, FacesMessage facesMessage) {
-        _delegate.addMessage(s, facesMessage);
-    }
-
-    public void release() {
-        _delegate.release();
-    }
-
-    public void renderResponse() {
-        _delegate.renderResponse();
-    }
-
-    public void responseComplete() {
-        _delegate.responseComplete();
-    }
-
-    public FacesContextProxy(FacesContext delegate) {
-        _delegate = delegate;
-        weaveDelegate();
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/LifefcycleProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/LifefcycleProxy.java
deleted file mode 100644
index a1a1e09..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/LifefcycleProxy.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.lifecycle.Lifecycle;
-import javax.faces.event.PhaseListener;
-import javax.faces.context.FacesContext;
-import javax.faces.FacesException;
-
-/**
- * Scripting enabled lifecycle
- *
- * @author Werner Punz
- */
-public class LifefcycleProxy extends Lifecycle implements Decorated {
-
-    private void weaveDelegate() {
-        if (_delegate != null)
-            _delegate = (Lifecycle) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_LIFECYCLE);
-    }
-
-    public LifefcycleProxy(Lifecycle delegate) {
-        _delegate = delegate;
-    }
-
-    public void addPhaseListener(PhaseListener phaseListener) {
-        weaveDelegate();
-        /*we can put our object weaving code into the add here*/
-        if (WeavingContext.isDynamic(phaseListener.getClass()))
-            phaseListener = (PhaseListener) WeavingContext.createMethodReloadingProxyFromObject(phaseListener, PhaseListener.class, ScriptingConst.ARTIFACT_TYPE_PHASELISTENER);
-
-        _delegate.addPhaseListener(phaseListener);
-    }
-
-    public void execute(FacesContext facesContext) throws FacesException {
-        weaveDelegate();
-        _delegate.execute(facesContext);
-    }
-
-    public PhaseListener[] getPhaseListeners() {
-        weaveDelegate();
-        return _delegate.getPhaseListeners();
-    }
-
-    public void removePhaseListener(PhaseListener phaseListener) {
-        weaveDelegate();
-        _delegate.removePhaseListener(phaseListener);
-    }
-
-    public void render(FacesContext facesContext) throws FacesException {
-        weaveDelegate();
-        _delegate.render(facesContext);
-    }
-
-    Lifecycle _delegate = null;
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/NavigationHandlerProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/NavigationHandlerProxy.java
deleted file mode 100644
index 630af9b..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/NavigationHandlerProxy.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.application.NavigationHandler;
-import javax.faces.context.FacesContext;
-
-/**
- * A reloading navigation handler
- *
- * @author Werner Punz
- */
-public class NavigationHandlerProxy extends NavigationHandler implements Decorated {
-
-    private void weaveDelegate() {
-        _delegate = (NavigationHandler) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_NAVIGATIONHANDLER);
-    }
-
-    public NavigationHandlerProxy(NavigationHandler delegate) {
-        super();
-        _delegate = delegate;
-    }
-
-    public void handleNavigation(FacesContext facesContext, String s, String s1) {
-        weaveDelegate();
-        _delegate.handleNavigation(facesContext, s, s1);
-    }
-
-    NavigationHandler _delegate;
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
deleted file mode 100644
index d2712f4..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseStream;
-import javax.faces.context.ResponseWriter;
-import javax.faces.render.RenderKit;
-import javax.faces.render.Renderer;
-import javax.faces.render.ResponseStateManager;
-import javax.servlet.ServletRequest;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * Weaving renderkit which
- * acts as a proxy factory for
- * our internal reloading referers
- *
- * @author Werner Punz
- */
-public class RenderkitProxy extends RenderKit implements Decorated {
-
-    RenderKit _delegate = null;
-
-    public RenderkitProxy(RenderKit delegate) {
-        _delegate = delegate;
-    }
-
-    public void addRenderer(String componentFamily, String rendererType, Renderer renderer) {
-        weaveDelegate();
-        //wo do it brute force here because we have sometimes casts and hence cannot rely on proxies
-        //renderers itself are flyweight patterns which means they are shared over objects
-        renderer = (Renderer) reloadInstance(renderer, ScriptingConst.ARTIFACT_TYPE_RENDERER);
-        _delegate.addRenderer(componentFamily, rendererType, renderer);
-    }
-
-    public Renderer getRenderer(String componentFamily, String rendererType) {
-        weaveDelegate();
-        return (Renderer) reloadInstance(_delegate.getRenderer(componentFamily, rendererType), ScriptingConst.ARTIFACT_TYPE_RENDERER);
-    }
-
-    public ResponseStateManager getResponseStateManager() {
-        weaveDelegate();
-        return _delegate.getResponseStateManager();
-    }
-
-    public ResponseWriter createResponseWriter(Writer writer, String s, String s1) {
-        weaveDelegate();
-        return (ResponseWriter) reloadInstance(_delegate.createResponseWriter(writer, s, s1), ScriptingConst.ARTIFACT_TYPE_RESPONSEWRITER);
-    }
-
-    public ResponseStream createResponseStream(OutputStream outputStream) {
-        weaveDelegate();
-        return (ResponseStream) reloadInstance(_delegate.createResponseStream(outputStream), ScriptingConst.ARTIFACT_TYPE_RESPONSESTREAM);
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-
-    private final void weaveDelegate() {
-        _delegate = (RenderKit) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_RENDERKIT);
-    }
-
-    private final Object reloadInstance(Object instance, int artefactType) {
-        if (instance == null) {
-            return null;
-        }
-        if (WeavingContext.isDynamic(instance.getClass()) && !alreadyWovenInRequest(instance.getClass().getName())) {
-            instance = WeavingContext.getWeaver().reloadScriptingInstance(instance, artefactType);
-            alreadyWovenInRequest(instance.getClass().getName());
-        }
-        return instance;
-    }
-
-    private final boolean alreadyWovenInRequest(String clazz) {
-        try {//portlets now can be enabled thanks to the jsf2 indirections regarding the external context
-            ServletRequest req = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
-            if (req.getAttribute(ScriptingConst.SCRIPTING_REQUSINGLETON + clazz) == null) {
-                req.setAttribute(ScriptingConst.SCRIPTING_REQUSINGLETON + clazz, "");
-                return false;
-            }
-            return true;
-        } catch(UnsupportedOperationException ex) {
-            //still in startup no additional weaving here
-            return true;
-        }
-    }
-
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/VariableResolverProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/VariableResolverProxy.java
deleted file mode 100644
index d5732b0..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/VariableResolverProxy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.el.*;
-
-import javax.faces.context.FacesContext;
-
-/**
- * objects loaded must
- * be checked if a reloading is needed
- *
- * @author Werner Punz
- */
-@SuppressWarnings("deprecation")
-public class VariableResolverProxy extends VariableResolver implements Decorated {
-    VariableResolver _delegate;
-
-    public VariableResolverProxy(VariableResolver delegate) {
-        _delegate = delegate;
-    }
-
-    public Object resolveVariable(FacesContext facesContext, String s) throws EvaluationException {
-        Object variable = _delegate.resolveVariable(facesContext, s);
-        if (variable != null && WeavingContext.isDynamic(variable.getClass()))
-            variable = WeavingContext.getWeaver().reloadScriptingInstance(variable, ScriptingConst.ARTIFACT_TYPE_MANAGEDBEAN);
-        return variable;
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ViewHandlerProxy.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ViewHandlerProxy.java
deleted file mode 100644
index fe647e3..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicdecorators/implemetations/ViewHandlerProxy.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.implemetations;
-
-import org.apache.myfaces.extensions.scripting.api.Decorated;
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-
-import javax.faces.application.ViewHandler;
-import javax.faces.context.FacesContext;
-import javax.faces.component.UIViewRoot;
-import javax.faces.FacesException;
-import java.util.Locale;
-import java.io.IOException;
-
-/**
- * Scripting enabled View Handler
- *
- * @author Werner Punz
- */
-public class ViewHandlerProxy extends ViewHandler implements Decorated {
-
-    ViewHandler _delegate = null;
-
-    private void weaveDelegate() {
-        if (_delegate != null) {
-            _delegate = (ViewHandler) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_VIEWHANDLER);
-        }
-    }
-
-    public ViewHandlerProxy(ViewHandler delegate) {
-        _delegate = delegate;
-    }
-
-    public String calculateCharacterEncoding(FacesContext facesContext) {
-        weaveDelegate();
-        return _delegate.calculateCharacterEncoding(facesContext);
-    }
-
-    public Locale calculateLocale(FacesContext facesContext) {
-        weaveDelegate();
-        return _delegate.calculateLocale(facesContext);
-    }
-
-    public String calculateRenderKitId(FacesContext facesContext) {
-        weaveDelegate();
-        return _delegate.calculateRenderKitId(facesContext);
-    }
-
-    public UIViewRoot createView(FacesContext facesContext, String s) {
-        weaveDelegate();
-        return _delegate.createView(facesContext, s);
-    }
-
-    public String getActionURL(FacesContext facesContext, String s) {
-        weaveDelegate();
-        return _delegate.getActionURL(facesContext, s);
-    }
-
-    public String getResourceURL(FacesContext facesContext, String s) {
-        weaveDelegate();
-        return _delegate.getResourceURL(facesContext, s);
-    }
-
-    public void initView(FacesContext facesContext) throws FacesException {
-        weaveDelegate();
-        _delegate.initView(facesContext);
-    }
-
-    public void renderView(FacesContext facesContext, UIViewRoot uiViewRoot) throws IOException, FacesException {
-        weaveDelegate();
-        _delegate.renderView(facesContext, uiViewRoot);
-    }
-
-    public UIViewRoot restoreView(FacesContext facesContext, String s) {
-        weaveDelegate();
-        return _delegate.restoreView(facesContext, s);
-    }
-
-    public void writeState(FacesContext facesContext) throws IOException {
-        weaveDelegate();
-        _delegate.writeState(facesContext);
-    }
-
-    public Object getDelegate() {
-        return _delegate;
-    }
-}
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/servlet/CustomChainLoader.java b/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/servlet/CustomChainLoader.java
deleted file mode 100644
index 5627a58..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/java/org/apache/myfaces/extensions/scripting/servlet/CustomChainLoader.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.extensions.scripting.servlet;
-
-import org.apache.myfaces.extensions.scripting.api.ScriptingWeaver;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.shared_impl.util.ClassLoaderExtension;
-
-import javax.servlet.ServletContext;
-import java.util.logging.Logger;
-
-/**
- * a custom chainloader which adds a groovy loading
- * facility to our myfaces loading plugin system
- *
- * @author Werner Punz
- */
-@SuppressWarnings("unused")
-public class CustomChainLoader extends ClassLoaderExtension {
-
-    /*
-       * servlet context init var for additional chain loader paths which have
-       * higher priority than the default ones 
-       */
-
-    ScriptingWeaver _scriptingWeaver = null;
-
-    public CustomChainLoader(ServletContext servletContext) {
-        _scriptingWeaver = WeavingContext.getWeaver();
-    }
-
-
-    public Class forName(String name) {
-        if(_scriptingWeaver == null || name == null) {
-            return null;
-        }
-        
-        if (name.endsWith(";")) {
-            name = name.substring(1, name.length() - 1);
-        }
-
-        if (name.startsWith("java.")) /*the entire java namespace is reserved so no use to do a specific classloading check here*/
-            return null;
-        if (name.startsWith("javax.")) /*the entire java namespace is reserved so no use to do a specific classloading check here*/
-            return null;
-        else if (name.startsWith("com.sun")) /*internal java specific namespace*/
-            return null;
-        else if (name.startsWith("sun.")) /*internal java specific namespace*/
-            return null;
-        else if (name.startsWith("org.apache") && !name.startsWith("org.apache.myfaces")) {
-            return null;
-        }
-        else if (name.startsWith("org.apache") && name.startsWith("org.apache.myfaces.config")) {
-            return null;
-        }
-        return _scriptingWeaver.loadScriptingClassFromName(name);
-    }
-}
\ No newline at end of file
diff --git a/extscript-core-root/extscript-myfaces12-extensions/src/main/resources/META-INF/faces-config.xml b/extscript-core-root/extscript-myfaces12-extensions/src/main/resources/META-INF/faces-config.xml
deleted file mode 100644
index 901782a..0000000
--- a/extscript-core-root/extscript-myfaces12-extensions/src/main/resources/META-INF/faces-config.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE faces-config
-        PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
-        "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
-
-<!--
- * 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.
--->
-
-<faces-config>
-    <factory>
-        <!--
-          all these factories are replacements for the normal ones
-          issue is we have to make a codeweaving for every bean created
-        -->
-        <application-factory>
-            org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories.ScriptingApplicationFactory
-        </application-factory>
-        <faces-context-factory>
-            org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories.ScriptingFacesContextFactory
-        </faces-context-factory>
-        <lifecycle-factory>
-            org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories.ScriptingLifecycleFactory
-        </lifecycle-factory>
-        <render-kit-factory>
-            org.apache.myfaces.extensions.scripting.jsf.dynamicdecorators.factories.ScriptingRenderkitFactory
-        </render-kit-factory>
-    </factory>
-
-    <lifecycle>
-        <phase-listener>org.apache.myfaces.extensions.scripting.jsf.RefreshPhaseListener</phase-listener>
-    </lifecycle>
-
-    <component>
-        <component-type>org.apache.myfaces.extensions.scripting.components.CompilerComponent</component-type>
-        <component-class>org.apache.myfaces.extensions.scripting.components.CompilerComponent</component-class>
-    </component>
-
-    <component>
-        <component-type>org.apache.myfaces.extensions.scripting.components.TaintHistory</component-type>
-        <component-class>org.apache.myfaces.extensions.scripting.components.TaintHistory</component-class>
-    </component>
-
-
-    <render-kit>
-        <renderer>
-            <component-family>javax.faces.Output</component-family>
-            <renderer-type>org.apache.myfaces.extensions.scripting.components.CompilerComponentRenderer</renderer-type>
-            <renderer-class>org.apache.myfaces.extensions.scripting.components.CompilerComponentRenderer</renderer-class>
-        </renderer>
-        <renderer>
-            <component-family>javax.faces.Output</component-family>
-            <renderer-type>org.apache.myfaces.extensions.scripting.components.TaintHistoryRenderer</renderer-type>
-            <renderer-class>org.apache.myfaces.extensions.scripting.components.TaintHistoryRenderer</renderer-class>
-        </renderer>
-
-    </render-kit>
-
-</faces-config>
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/pom.xml b/extscript-examples/myfaces12-example/pom.xml
deleted file mode 100644
index b1b11f0..0000000
--- a/extscript-examples/myfaces12-example/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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">
-    <parent>
-        <artifactId>extscript-examples</artifactId>
-        <groupId>org.apache.myfaces.extensions.scripting</groupId>
-        <version>1.0.3-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.myfaces.extensions.scripting</groupId>
-    <artifactId>myfaces12-example</artifactId>
-    <packaging>war</packaging>
-    <name>A custom project using myfaces 1.2</name>
-    <version>1.0.3-SNAPSHOT</version>
-    <url>http://www.apache.org</url>
-
-    <scm>
-        <connection>
-            scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-examples/myfaces12-example
-        </connection>
-        <developerConnection>
-            scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-examples/myfaces12-example
-        </developerConnection>
-        <url>http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces12-example</url>
-    </scm>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-all</artifactId>
-            <version>${groovy.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.extensions.scripting</groupId>
-            <artifactId>extscript-myfaces12-bundle</artifactId>
-            <version>1.0.3-SNAPSHOT</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-impl</artifactId>
-            <version>${myfaces12.version}</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.portlet</groupId>
-            <artifactId>portlet-api</artifactId>
-            <version>1.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.sun.facelets</groupId>
-            <artifactId>jsf-facelets</artifactId>
-            <version>1.1.11</version>
-        </dependency>
-        <!-- jstl because of facelets -->
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>jstl</artifactId>
-            <version>1.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.tomahawk</groupId>
-            <artifactId>tomahawk</artifactId>
-            <version>1.1.6</version>
-            <scope>compile</scope>
-            <exclusions>
-                <exclusion>
-                    <artifactId>jstl</artifactId>
-                    <groupId>javax.servlet</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-    </dependencies>
-
-
-</project>
diff --git a/extscript-examples/myfaces12-example/src/main/conf/dev/web.xml b/extscript-examples/myfaces12-example/src/main/conf/dev/web.xml
deleted file mode 100644
index f1c2049..0000000
--- a/extscript-examples/myfaces12-example/src/main/conf/dev/web.xml
+++ /dev/null
@@ -1,315 +0,0 @@
-<?xml version="1.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.
--->
-<!--
-This web.xml is for development purposes
-it can be pulled in via mvn -P development ....
-it replaces the original web.xml in case
-of a development profile being set!
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
-         version="2.4">
-
-    <description>MyProject web.xml</description>
-
-    <!--optional: context-param>
-        <description>Comma separated list of URIs of (additional) faces config files.
-            (e.g. /WEB-INF/my-config.xml)
-            See JSF 1.0 PRD2, 10.3.2
-            Attention: You do not need to put /WEB-INF/faces-config.xml in here.
-        </description>
-        <param-name>javax.faces.CONFIG_FILES</param-name>
-        <param-value>/WEB-INF/examples-config.xml</param-value>
-    </context-param-->
-
-    <!-- clean method working for myfaces 1.2.8+ -->
-
-    <context-param>
-        <description>
-            Initializes the plugins for our groovy handlers
-        </description>
-        <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
-        <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy
-        </param-value>
-    </context-param>
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java
-        </param-value>
-    </context-param>
-
-
-    <context-param>
-        <description>resource paths for our custom JSF2 resource resolver</description>
-        <param-name>org.apache.myfaces.extensions.scripting.resources.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp
-        </param-value>
-    </context-param>
-
-    <context-param>
-         <description>a redirecting Facelet resource resolver which allows to pick up templates and resources from our
-             source dir
-         </description>
-         <param-name>facelets.RESOURCE_RESOLVER</param-name>
-         <param-value>org.apache.myfaces.extensions.scripting.facelet.ReroutingResourceResolver</param-value>
-     </context-param>
-    
-
-    
-    <context-param>
-        <description>State saving method: "client" or "server" (= default)
-            See JSF Specification 2.5.3
-        </description>
-        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
-        <param-value>server</param-value>
-    </context-param>
-
-    <context-param>
-        <param-name>facelets.LIBRARIES</param-name>
-        <param-value>/WEB-INF/facelets/groovy-taglib.xml</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            Defines the amount (default = 20) of the latest views are stored in session.
-        </description>
-        <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
-        <param-value>20</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            If true (default) the state will be serialized to a byte stream before it
-            is written to the session.
-            If false the state will not be serialized to a byte stream.
-        </description>
-        <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default) and if
-            org.apache.myfaces.SERIALIZE_STATE_IN_SESSION is true (= default)
-            If true (default) the serialized state will be compressed before it
-            is written to the session. If false the state will not be compressed.
-        </description>
-        <param-name>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>This parameter tells MyFaces if javascript code should be allowed in the
-            rendered HTML output.
-            If javascript is allowed, command_link anchors will have javascript code
-            that submits the corresponding form.
-            If javascript is not allowed, the state saving info and nested parameters
-            will be added as url parameters.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
-        <param-value>false</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, rendered HTML code will be formatted, so that it is "human readable".
-            i.e. additional line separators and whitespace will be written, that do not
-            influence the HTML code.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, a javascript function will be rendered that is able to restore the
-            former vertical scroll on every request. Convenient feature if you have pages
-            with long lists and you do not want the browser page to always jump to the top
-            if you trigger a link or button action that stays on the same page.
-            Default: "false"
-        </description>
-        <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Used for encrypting view state. Only relevant for client side
-            state saving. See MyFaces wiki/web site documentation for instructions
-            on how to configure an application for diffenent encryption strengths.
-        </description>
-        <param-name>org.apache.myfaces.SECRET</param-name>
-        <param-value>NzY1NDMyMTA=</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Validate managed beans, navigation rules and ensure that forms are not nested.
-        </description>
-        <param-name>org.apache.myfaces.VALIDATE</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Treat readonly same as if disabled attribute was set for select elements.
-        </description>
-        <param-name>org.apache.myfaces.READONLY_AS_DISABLED_FOR_SELECTS</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Use the defined class as the class which will be called when a resource is added to the
-            ExtensionFilter handling. Using StreamingAddResource here helps with performance. If you want to add
-            custom components and want to use the ExtensionFilter, you need to provide your custom implementation here.
-        </description>
-        <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name>
-        <param-value>org.apache.myfaces.renderkit.html.util.DefaultAddResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Virtual path in the URL which triggers loading of resources for the MyFaces extended components
-            in the ExtensionFilter.
-        </description>
-        <param-name>org.apache.myfaces.RESOURCE_VIRTUAL_PATH</param-name>
-        <param-value>/faces/myFacesExtensionResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Check if the extensions-filter has been properly configured.
-        </description>
-        <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Define partial state saving as true/false.
-        </description>
-        <param-name>javax.faces.PARTIAL_STATE_SAVING_METHOD</param-name>
-        <param-value>false</param-value>
-    </context-param>
-
-    <!-- Use Documents Saved as *.xhtml -->
-    <context-param>
-        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-        <param-value>.xhtml</param-value>
-    </context-param>
-
-    <!-- Special Debug Output for Development -->
-    <context-param>
-        <param-name>facelets.DEVELOPMENT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <!-- Extensions Filter -->
-    <filter>
-        <filter-name>extensionsFilter</filter-name>
-        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
-        <init-param>
-            <description>Set the size limit for uploaded files.
-                Format: 10 - 10 bytes
-                10k - 10 KB
-                10m - 10 MB
-                1g - 1 GB
-            </description>
-            <param-name>uploadMaxFileSize</param-name>
-            <param-value>100m</param-value>
-        </init-param>
-        <init-param>
-            <description>Set the threshold size - files
-                below this limit are stored in memory, files above
-                this limit are stored on disk.
-
-                Format: 10 - 10 bytes
-                10k - 10 KB
-                10m - 10 MB
-                1g - 1 GB
-            </description>
-            <param-name>uploadThresholdSize</param-name>
-            <param-value>100k</param-value>
-        </init-param>
-    </filter>
-
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>extensionsFilter</filter-name>
-        <url-pattern>*.jsf</url-pattern>
-    </filter-mapping>
-    <filter-mapping>
-        <filter-name>extensionsFilter</filter-name>
-        <url-pattern>/faces/*</url-pattern>
-    </filter-mapping>
-
-    <!-- Listener, to allow Jetty serving MyFaces apps -->
-    <listener>
-        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
-    </listener>
-
-    <!-- Faces Servlet -->
-    <servlet>
-        <servlet-name>Faces Servlet</servlet-name>
-        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <!-- Faces Servlet Mapping -->
-    <servlet-mapping>
-        <servlet-name>Faces Servlet</servlet-name>
-        <url-pattern>*.jsf</url-pattern>
-    </servlet-mapping>
-
-    <!-- Welcome files -->
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-        <welcome-file>index.html</welcome-file>
-    </welcome-file-list>
-
-</web-app>
diff --git a/extscript-examples/myfaces12-example/src/main/java/org/apache/myfaces/blank/HelloWorldController.java b/extscript-examples/myfaces12-example/src/main/java/org/apache/myfaces/blank/HelloWorldController.java
deleted file mode 100644
index d287a0d..0000000
--- a/extscript-examples/myfaces12-example/src/main/java/org/apache/myfaces/blank/HelloWorldController.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.blank;
-
-/**
- * A typical simple backing bean, that is backed to <code>helloworld.jsp</code>
- */
-public class HelloWorldController {
-
-    //properties
-    private String name;
-
-    private int mylen = 10;
-
-    /**
-     * default empty constructor
-     */
-    public HelloWorldController() {
-    }
-
-    //-------------------getter & setter
-
-    public String getName() {
-        ClassLoader cls = Thread.currentThread().getContextClassLoader();
-        return name;
-    }
-
-    public void setName(String name) {
-        ClassLoader cls = Thread.currentThread().getContextClassLoader();
-        this.name = name;
-    }
-
-    /**
-     * Method that is backed to a submit button of a form.
-     */
-    public String send() {
-        //do real logic, return a string which will be used for the navigation system of JSF
-        return "success";
-    }
-
-    public int getMylen() {
-        return mylen;
-    }
-
-    public void setMylen(int mylen) {
-        this.mylen = mylen;
-    }
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml
deleted file mode 100644
index d345e6f..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/groovy-taglib.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
-<facelet-taglib>
-    <!-- author: werner.punz@irian.at -->
-
-    <namespace>http://myfaces.apache.org/groovy</namespace>
-    <tag>
-        <tag-name>groovyvalidator</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.groovyloader.test.TestValidator</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>groovyconverter</tag-name>
-        <converter>
-            <converter-id>org.apache.myfaces.groovyloader.test.TestConverter</converter-id>
-        </converter>
-    </tag>
-    <tag>
-        <tag-name>testcomponent</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.groovyloader.test.TestComponent</component-type>
-            <renderer-type>org.apache.myfaces.groovyloader.test.Test</renderer-type>
-        </component>
-    </tag>
-</facelet-taglib>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml
deleted file mode 100644
index b9fc141..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/facelets/tomahawk.taglib.xml
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
-<facelet-taglib>
-    <!-- author: thomas.jachmann@mindmatters.de -->
-    <namespace>http://myfaces.apache.org/tomahawk</namespace>
-    <tag>
-        <tag-name>commandButton</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandButton</component-type>
-            <renderer-type>org.apache.myfaces.Button</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandLink</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandLink</component-type>
-            <renderer-type>org.apache.myfaces.Link</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataTable</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataTable</component-type>
-            <renderer-type>org.apache.myfaces.Table</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputHidden</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputHidden</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputSecret</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputSecret</component-type>
-            <renderer-type>org.apache.myfaces.Secret</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputText</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputText</component-type>
-            <renderer-type>org.apache.myfaces.Text</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputTextHelp</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputTextHelp</component-type>
-            <renderer-type>org.apache.myfaces.TextHelp</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputTextarea</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputTextarea</component-type>
-            <renderer-type>org.apache.myfaces.Textarea</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>graphicImage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlGraphicImage</component-type>
-            <renderer-type>org.apache.myfaces.Image</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>message</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlMessage</component-type>
-            <renderer-type>org.apache.myfaces.Message</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>messages</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlMessages</component-type>
-            <renderer-type>org.apache.myfaces.Messages</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>outputLabel</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlOutputLabel</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>outputText</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlOutputText</component-type>
-            <renderer-type>org.apache.myfaces.Text</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelGrid</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelGrid</component-type>
-            <renderer-type>org.apache.myfaces.Grid</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelGroup</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelGroup</component-type>
-            <renderer-type>org.apache.myfaces.Group</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneMenu</component-type>
-            <renderer-type>org.apache.myfaces.Menu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyMenu</component-type>
-            <renderer-type>org.apache.myfaces.Menu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneRadio</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneRadio</component-type>
-            <renderer-type>org.apache.myfaces.Radio</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectBooleanCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectBooleanCheckbox</component-type>
-            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyCheckbox</component-type>
-            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneListbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneListbox</component-type>
-            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyListbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyListbox</component-type>
-            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputCalendar</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputCalendar</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jsValueChangeListener</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.JsValueChangeListener</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jsValueSet</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlJsValueSet</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>checkbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCheckbox</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandNavigation</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandNavigation</component-type>
-            <renderer-type>org.apache.myfaces.Navigation</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandNavigation2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandNavigationItem</component-type>
-            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandSortHeader</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandSortHeader</component-type>
-            <renderer-type>org.apache.myfaces.SortHeader</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataList</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataList</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataScroller</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataScroller</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputDate</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputDate</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputFileUpload</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputFileUpload</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputHtml</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.InputHtml</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>navigationMenuItem</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.NavigationMenuItem</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>navigationMenuItems</tag-name>
-        <component>
-            <component-type>javax.faces.SelectItems</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jscookMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.JSCookMenu</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelLayout</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelLayout</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelNavigation</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelNavigation</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelNavigation2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelNavigationMenu</component-type>
-            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelTab</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelTab</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelTabbedPane</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelTabbedPane</component-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>tabChangeListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>collapsiblePanel</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCollapsiblePanel</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneCountry</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SelectOneCountry</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneLanguage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SelectOneLanguage</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>stylesheet</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Stylesheet</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>div</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Div</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>htmlTag</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTag</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>radio</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlRadio</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>tree</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTree</component-type>
-            <renderer-type>org.apache.myfaces.HtmlTree</renderer-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>treeSelectionListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <!-- deactivated since there's no component! tag>
-        <tag-name>iconProvider</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>treeColumn</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTreeColumn</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>treeCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTreeCheckbox</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>tree2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTree2</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelStack</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelStack</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>popup</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPopup</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>newspaperTable</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlNewspaperTable</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>aliasBean</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.AliasBean</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>aliasBeansScope</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.AliasBeansScope</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>buffer</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Buffer</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>saveState</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SaveState</component-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>updateActionListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>validateCreditCard</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.CreditCard</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>validateEmail</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.Email</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>validateEqual</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.Equal</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>swapImage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSwapImage</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>columns</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlColumns</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>column</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlColumn</component-type>
-        </component>
-    </tag>
-    <!-- additional validators (note: not in tld, so no code completion) -->
-    <tag>
-        <tag-name>validateRegExpr</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.RegExpr</validator-id>
-        </validator>
-    </tag>
-</facelet-taglib>
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/faces-config.xml b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/faces-config.xml
deleted file mode 100644
index 712cdeb..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.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.
--->
-<faces-config version="1.2"
-              xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:xi="http://www.w3.org/2001/XInclude"
-              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
-
-    <!-- managed beans of the simple hello world app -->
-    <managed-bean>
-        <managed-bean-name>helloWorld</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.blank.HelloWorldController</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>testbean</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.groovyloader.test.TestBean</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>javatestbean</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.javaloader.test.TestBean2</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>blogView</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.groovyloader.blog.Blog</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>blogService</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.groovyloader.blog.BlogService</managed-bean-class>
-        <managed-bean-scope>application</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>javaBlogView</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.javaloader.blog.Blog</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-
-    <managed-bean>
-        <managed-bean-name>javaBlogService</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.javaloader.blog.BlogService</managed-bean-class>
-        <managed-bean-scope>application</managed-bean-scope>
-    </managed-bean>
-
-    <application>
-        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
-
-        <navigation-handler>
-            org.apache.myfaces.groovyloader.test.TestNavigationHandler
-        </navigation-handler>
-
-    </application>
-
-    <lifecycle>
-
-        <phase-listener>
-            org.apache.myfaces.groovyloader.test.TestPhaseListener
-        </phase-listener>
-    </lifecycle>
-
-
-    <!-- navigation rules for helloWorld.jsp -->
-    <navigation-rule>
-        <from-view-id>/helloWorld.*</from-view-id>
-        <navigation-case>
-            <from-outcome>success</from-outcome>
-            <to-view-id>/page2.jsf</to-view-id>
-        </navigation-case>
-    </navigation-rule>
-
-    <!-- navigation rules for page2.jsp -->
-    <navigation-rule>
-        <from-view-id>/page2.*</from-view-id>
-        <navigation-case>
-            <from-outcome>back</from-outcome>
-            <to-view-id>/helloWorld.jsf</to-view-id>
-        </navigation-case>
-    </navigation-rule>
-
-
-    <validator>
-        <validator-id>org.apache.myfaces.groovyloader.test.TestValidator</validator-id>
-        <validator-class>org.apache.myfaces.groovyloader.test.TestValidator</validator-class>
-    </validator>
-    <converter>
-        <converter-id>org.apache.myfaces.groovyloader.test.TestConverter</converter-id>
-        <converter-class>org.apache.myfaces.groovyloader.test.TestConverter</converter-class>
-    </converter>
-
-    <component>
-        <component-type>org.apache.myfaces.groovyloader.test.TestComponent</component-type>
-        <component-class>org.apache.myfaces.groovyloader.test.TestComponent</component-class>
-    </component>
-    <render-kit>
-        <renderer>
-            <component-family>javax.faces.Input</component-family>
-            <renderer-type>org.apache.myfaces.groovyloader.test.Test</renderer-type>
-            <renderer-class>org.apache.myfaces.groovyloader.test.TestRenderer</renderer-class>
-        </renderer>
-    </render-kit>
-   
-</faces-config>
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/Blog.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/Blog.groovy
deleted file mode 100644
index 90b34a3..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/Blog.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.blog
-
-import org.apache.myfaces.groovyloader.blog.JSFUtil;
-import org.apache.myfaces.groovyloader.blog.BlogService
-import java.util.logging.Logger;
-
-
-
-public class Blog {
-  //bug application and session scoped beans  are not refreshed structurally yet
-
-  Logger log = Logger.getLogger("Blog")
-
-  String title = "Hello to the myfaces dynamic blogging Groovy JSF 1.2 Blog "
-  String title1 = """\
-                    You can alter the code for this small blogging application on the fly,
-                    you even can add new classes on the fly and Grooy will pick it up
-                    (you can use every groovy feature as untyped references or multiline comments)
-                    """
-
-  String firstName = ""
-  String lastName = ""
-  String topic = ""
-
-  String content = ""
-
-
-  public String addEntry() {
-    log.info("adding entry");
-
-    def service = JSFUtil.resolveVariable("blogService")
-
-    if (service == null) {
-      log.severe("service not found")
-    } else {
-      log.info("service found")
-
-    }
-
-    BlogEntry entry = new BlogEntry()
-    //we now map it in the verbose way, the lean way would be to do direct introspection attribute mapping
-
-    entry.firstName = firstName
-    entry.lastName = lastName
-    entry.topic = topic
-    entry.content = content
-
-
-    service.addEntry2(entry)
-
-    //we stay on the same page
-    return "blog";
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogEntry.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogEntry.groovy
deleted file mode 100644
index fa3193c..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogEntry.groovy
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.blog;
-
-/**
- * The entry class 
- */
-public class BlogEntry {
-
-  String firstName = ""
-  String lastName = ""
-  String topic = ""
-  String content = ""
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
deleted file mode 100644
index 68cf8d6..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.blog
-
-import org.apache.myfaces.groovyloader.blog.BlogEntry;
-import java.util.List
-import java.util.ArrayList
-import java.util.logging.Logger
-
-
-
-public class BlogService {
-  def blogEntries = new ArrayList()
-
-  public void addEntry2(BlogEntry entry) {
-    Logger log = Logger.getLogger(BlogService.class.getName())
-    log.info("(BlogService.addEntry2) from groovy blogservice: Adding entry")
-    blogEntries << entry
-    log.info("(BlogService.addEntry2) from groovy blogservice: Adding entry"+blogEntries.size())
-
-  }
-
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/JSFUtil.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/JSFUtil.groovy
deleted file mode 100644
index a6990a2..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/JSFUtil.groovy
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.blog;
-
-import javax.faces.context.FacesContext
-import java.util.logging.Logger;
-
-/**
- * Utils class to keep the code clean and mean
- */
-public class JSFUtil {
-
-  public static Object resolveVariable(String beanName) {
-    Logger log = Logger.getLogger(JSFUtil.class.getName())
-    log.info("ElResolver Instance:" + FacesContext.getCurrentInstance().getELContext().getELResolver().toString())
-    return FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, beanName)
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestActionListener.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestActionListener.groovy
deleted file mode 100644
index 1bba701..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestActionListener.groovy
+++ /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.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.event.ActionListener
-import javax.faces.event.ActionEvent
-
-/**
- * @author Werner Punz
- */
-class TestActionListener implements ActionListener {
-
-  public void processAction(ActionEvent event) {
-    println "processing action from actionlistener"
-  }
-
-}
-
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestBean.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestBean.groovy
deleted file mode 100644
index a33015d..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestBean.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-/**
- * @author Werner Punz
- */
-class TestBean {
-  String helloworld = "Hello from the bean"
-
-  //note you can add new atrtributes
-  //no setter or getter is needed
-  //and with a single request you will get the
-  //attribute be used in your page
-  //give it a try
-
-  //String newAttribute = "This is a new attribute"
-  //uncomment this and add a control to the page displaying it
-
-  public String getHelloworld() {
-    return helloworld
-  }
-
-
-  public String doit() {
-    System.out.println("doit called")
-
-    return "success"
-
-  }
-
-
-  public String getXxx() {
-    " Simple text you can change me on the fly"
-  }
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestComponent.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestComponent.groovy
deleted file mode 100644
index e4c4e3e..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestComponent.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.component.UIInput
-import javax.faces.context.FacesContext
-import javax.faces.el.ValueBinding
-
-/**
- * @author Werner Punz
- */
-public class TestComponent extends UIInput {
-
-  private static final String DEFAULT_RENDERER_TYPE2 = "org.apache.myfaces.groovyloader.test.Test";
-
-  String _testattr = "component text";
-  def _testattr_changed = true;
-  def testattr_changed = true;
-
-
-  public TestComponent() {
-    super()
-    setRendererType(DEFAULT_RENDERER_TYPE2)
-  }
-
-  public Object saveState(FacesContext context) {
-    def values = []
-    values[0] = super.saveState(context)
-    values[1] = testattr
-    return values.toArray()
-  }
-
-  public void restoreState(FacesContext context, Object state) {
-    super.restoreState(context, state[0]);
-    _testattr = state[1]
-  }
-
-  public void setTestattr(String attr) {
-    _testattr = attr
-  }
-
-  public String getTestattr() {
-    if (_testattr != null)
-      return _testattr
-
-    ValueBinding vb = getValueBinding("testattr")
-    String v = vb != null ? (String) vb.getValue(getFacesContext()) : null
-    return v != null ? v : ""
-
-  }
-
-
-  public String getFamily() {
-    return "javax.faces.Input";
-  }
-
-}
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestConverter.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestConverter.groovy
deleted file mode 100644
index 9791cda..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestConverter.groovy
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.convert.Converter
-import javax.faces.context.FacesContext
-import javax.faces.component.UIComponent
-
-/**
- * @author Werner Punz
- */
-class TestConverter implements Converter {
-
-  public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
-    print "converting $s"
-    return s;
-  }
-
-  public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
-    print "converting back  aa"
-    return ((String) o);
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestNavigationHandler.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestNavigationHandler.groovy
deleted file mode 100644
index 0c2286d..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestNavigationHandler.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.application.NavigationHandler
-import javax.faces.context.FacesContext
-
-/**
- * @author Werner Punz
- */
-class TestNavigationHandler extends NavigationHandler {
-  NavigationHandler _delegate = null;
-
-  public TestNavigationHandler() {
-    super();
-
-  }
-
-
-  public TestNavigationHandler(NavigationHandler delegate) {
-    super();
-    _delegate = delegate
-
-  }
-
-
-
-  public void handleNavigation(FacesContext facesContext, String s, String s1) {
-    // if(delegate != null)
-    System.out.println("handle navigation")
-
-    _delegate.handleNavigation(facesContext, s, s1)
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestPhaseListener.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestPhaseListener.groovy
deleted file mode 100644
index 51131b3..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestPhaseListener.groovy
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.event.PhaseListener
-import javax.faces.event.PhaseEvent
-import javax.faces.event.PhaseId
-
-/**
- * @author Werner Punz
- */
-class TestPhaseListener implements PhaseListener {
-
-  public void afterPhase(PhaseEvent event) {
-    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE)
-      println "restoring a view bbb bbb" + event.getPhaseId()
-
-  }
-
-  public void beforePhase(PhaseEvent event) {
-  }
-
-  public PhaseId getPhaseId() {
-    return PhaseId.ANY_PHASE;
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
deleted file mode 100644
index 5bac16d..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestRenderer.groovy
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlTextRendererBase
-import javax.faces.context.FacesContext
-import javax.faces.component.UIComponent
-import javax.faces.context.ResponseWriter;
-
-/**
- * @author Werner Punz
- */
-public class TestRenderer extends HtmlTextRendererBase {
-
-  public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) {
-
-    facesContext.responseWriter.write """
-            <h1>Hello from a groovy JSF components renderer </h1>
-
-            <p> you can find my sources under WEB-INF/groovy/... </p>
-
-            <p> you can edit the artefacts is running</p>
-            <p> I will pick up the changes after you have hit the reload button </p>
-
-             One note however, <br /> you cannot change components with a simple page
-            refresh,<br /> this works only for renderers
-            <p> you have to rebuild the component tree</p>
-
-            <p> Once you are done, <br /> you can move your sources over and have <br /> them compiled into
-            java classes to gain more speed </p>
-
-            <p> You can prototype every jsf artefact that way,<br /> managed beans, renderers, validators,
-            phase listeners </p>
-
-            Test for attribute: $uiComponent.testattr
-        """
-
-    //hello(facesContext.responseWriter)
-
-    super.encodeBegin(facesContext, uiComponent);    //To change body of overridden methods use File | Settings | File Templates.
-  }
-
-
-  public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) {
-    print super.toString()
-    super.encodeEnd(facesContext, uiComponent);    //To change body of overridden methods use File | Settings | File Templates.
-    facesContext.getResponseWriter().write """\
-            encode end here
-        """
-
-  }
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestValidator.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestValidator.groovy
deleted file mode 100644
index 56ce96b..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestValidator.groovy
+++ /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.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.validator.Validator
-import javax.faces.context.FacesContext
-import javax.faces.component.UIComponent
-import javax.faces.FacesException
-import javax.faces.application.FacesMessage
-import javax.faces.validator.ValidatorException
-
-/**
- * @author Werner Punz
- */
-class TestValidator implements Validator {
-
-  public void validate(FacesContext facesContext, UIComponent uiComponent, Object o) {
-    if(!((String)o).equals("hello world")) {
-      print ("error found")
-      throw new ValidatorException (new FacesMessage("Validation failed for field please input hello world"))
-    }
-    println "validating testvalidation  "
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestViewHandler.groovy b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestViewHandler.groovy
deleted file mode 100644
index 40b1039..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/test/TestViewHandler.groovy
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.groovyloader.test
-
-import javax.faces.application.ViewHandler
-import javax.faces.context.FacesContext
-import javax.faces.component.UIViewRoot
-
-/**
- * @author Werner Punz
- */
-class TestViewHandler extends ViewHandler {
-  //setters and getters are added implicitely
-  ViewHandler delegate;
-
-  /**
-   * needed for reloading
-   */
-  public TestViewHandler() {
-    super();
-  }
-
-  public TestViewHandler(ViewHandler delegate) {
-    super();
-    this.delegate = delegate;
-  }
-
-
-  public Locale calculateLocale(FacesContext facesContext) {
-    return delegate.calculateLocale(facesContext);
-  }
-
-  public String calculateRenderKitId(FacesContext facesContext) {
-    return delegate.calculateRenderKitId(facesContext);
-  }
-
-  public UIViewRoot createView(FacesContext facesContext, String s) {
-    return delegate.createView(facesContext, s);
-  }
-
-  public String getActionURL(FacesContext facesContext, String s) {
-    return delegate.getActionURL(facesContext, s);
-  }
-
-  public String getResourceURL(FacesContext facesContext, String s) {
-    return delegate.getResourceURL(facesContext, s);
-  }
-
-  public void renderView(FacesContext facesContext, UIViewRoot uiViewRoot) {
-    println "hello world from our view handler2 RENDERVIEW"
-
-    delegate.renderView(facesContext, uiViewRoot);
-  }
-
-  public UIViewRoot restoreView(FacesContext facesContext, String s) {
-
-    return delegate.restoreView(facesContext, s);
-  }
-
-  public void writeState(FacesContext facesContext) {
-    delegate.writeState(facesContext);
-  }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/Blog.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/Blog.java
deleted file mode 100644
index dd19e88..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/Blog.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.blog;
-
-import org.apache.myfaces.javaloader.blog.DependencyTestAnnotation;
-
-import static org.apache.myfaces.javaloader.blog.JSFUtil.*;
-import java.util.logging.Logger;
-
-/**
- * @author werpu2
- * @date: 01.09.2009
- */
-@DependencyTestAnnotation
-
-public class Blog {
-
-    String title = "Hello to the MyFaces dynamic Java blogging example";
-    String title1 = "You can alter the code for this small blogging application on the fly, " +
-            "you even can add new classes on the fly and Java will pick it up";
-
-    String title3 = "bla";
-    String title4 = "bla2";
-
-    String title5 = "test  from title5";
-
-    String firstName = "";
-    String lastName = "";
-    String topic = "";
-
-    String content = "";
-
-    private Logger getLog() {
-        return Logger.getLogger(this.getClass().getName());
-    }
-
-    public String addEntry2() {
-        getLog().info("adding entry");
-
-        BlogService service = (BlogService) JSFUtil.resolveVariable("javaBlogService");
-
-        if (service == null) {
-            getLog().severe("service   not found");
-        } else {
-            getLog().info("service found");
-        }
-
-        BlogEntry entry = new BlogEntry();
-        //we now map it in the verbose way, the lean way would be to do direct introspection attribute mapping
-
-        entry.setFirstName(firstName);
-        entry.setLastName(lastName);
-        entry.setTopic(topic);
-        entry.setContent(content);
-
-        if (service != null) {
-            /*convenience method to call a method on an object dynamically
-            * executeMethod and cast are static imports which encapsule the
-            * ugly stuff the java introspection provides and reduce
-            * the loc down to sane levels
-            *
-            * note the behavior in case of calling errors
-            * is changed from the default managed behavior
-            * to an unmanaged behavior. This is mostly
-            * the same behavior you get from scripting engines!
-            * 
-            */
-            service.addEntry2(entry);
-            //executeMethod(service, "addEntry",  entry);
-        }
-
-        //we stay on the same page
-        return null;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getTitle1() {
-        return title1;
-    }
-
-    public void setTitle1(String title1) {
-        this.title1 = title1;
-    }
-
-    public String getFirstName() {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName) {
-        this.firstName = firstName;
-    }
-
-    public String getLastName() {
-        return lastName;
-    }
-
-    public void setLastName(String lastName) {
-        this.lastName = lastName;
-    }
-
-    public String getTopic() {
-        return topic;
-    }
-
-    public void setTopic(String topic) {
-        this.topic = topic;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-
-    public String getTitle3() {
-        return "title 3 from java blog";
-    }
-
-    public void setTitle3(String title3) {
-        this.title3 = title3;
-    }
-
-    public String getTitle4() {
-        return title4;
-    }
-
-    public void setTitle4(String title4) {
-        this.title4 = title4;
-    }
-
-    public String getTitle5() {
-        return title5;
-    }
-
-    public void setTitle5(String title5) {
-
-    }
-
-}
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogEntry.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogEntry.java
deleted file mode 100644
index 4519aa8..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogEntry.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.blog;
-
-/**
- * @author werpu2
- * @date: 01.09.2009
- */
-public class BlogEntry {
-
-    String firstName = "";
-    String lastName = "";
-    String topic = "";
-    String content = "";
-
-    public String getFirstName() {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName) {
-        this.firstName = firstName;
-    }
-
-    public String getLastName() {
-        return lastName;
-    }
-
-    public void setLastName(String lastName) {
-        this.lastName = lastName;
-    }
-
-    public String getTopic() {
-        return topic;
-    }
-
-    public void setTopic(String topic) {
-        this.topic = topic;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-}
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogService.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogService.java
deleted file mode 100644
index cbb68d4..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/BlogService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.blog;
-
-import java.util.List;
-import java.util.LinkedList;
-import java.util.Collections;
-
-/**
- * @author werpu2
- * @date: 01.09.2009
- */
-public class BlogService {
-
-    /**
-     * note we cannot cast on dynamically referenced
-     * and recompiled objects which are shared between beans
-     * because due to dynamic recompilation
-     * <p/>
-     * Object a->references b does not reference b of the same class
-     * as object c->references b, we have to use introspection in this case
-     * we can use our utils class to make it a tiny bit more comfortable
-     * <p/>
-     * Statically compiled types always stay the same however
-     * the same goes for interfaces which are present as compiled code only
-     */
-    List<Object> blogEntries = Collections.synchronizedList(new LinkedList<Object>());
-
-    @DependencyTestAnnotation
-    public void addEntry2(BlogEntry entry) {
-        if (entry != null) {
-            blogEntries.add(entry);
-        }
-    }
-
-    public List<Object> getBlogEntries() {
-        return blogEntries;
-    }
-
-    public void setBlogEntries(List<Object> blogEntries) {
-        this.blogEntries = blogEntries;
-    }
-}
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/DependencyTestAnnotation.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/DependencyTestAnnotation.java
deleted file mode 100644
index 393bbdd..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/DependencyTestAnnotation.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.blog;
-
-import java.lang.annotation.*;
-
-@Retention(RetentionPolicy.RUNTIME)
-public @interface DependencyTestAnnotation {
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/JSFUtil.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/JSFUtil.java
deleted file mode 100644
index 0a4635e..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/blog/JSFUtil.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.blog;
-
-import javax.faces.context.FacesContext;
-import java.util.logging.Logger;
-
-import static org.apache.myfaces.extensions.scripting.core.util.ReflectUtil.executeMethod;
-
-/**
- * @author werpu2
- * @date: 01.09.2009
- * <p/>
- * A helper for JSF and introspection related tasks
- */
-public class JSFUtil {
-
-    public JSFUtil() {
-    }
-
-    /**
-     * resolves a variable in the current facesContext
-     *
-     * @param beanName
-     * @return
-     */
-    public static Object resolveVariable(String beanName) {
-        Logger log = Logger.getLogger(JSFUtil.class.getName());
-        Object facesContext = FacesContext.getCurrentInstance();
-
-        Object elContext = executeMethod(facesContext, "getELContext");
-        Object elResolver = executeMethod(elContext, "getELResolver");
-
-        /*
-         if you want to enable this then use
-         org.apache.myfaces.extensions.scripting.java.JAR_PATHS
-         pointing towards the lingering jars
-         The compiler cannot pick up the implicit containers classpaths
-        */
-        //we use the introspection calls here to achieve our goal that way
-        //we can shift the dependency resolution from compile time to runtime
-        return executeMethod(elResolver, "getValue", elContext, null, beanName);
-        // return FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, beanName);
-
-    }
-
-}
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestBean2.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestBean2.java
deleted file mode 100644
index bf82c7f..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestBean2.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.test;
-
-public class TestBean2 {
-    String sayHello = "hello world ";
-    String hello2 = "hello from added attribute hello2";
-    String hello3 = "hello from  added attribute hello3";
-
-    public String getSayHello() {
-        return "Hello from the dynamic bean TestBean2  - " + TestClass2.hello2 +" - "+ hello3;
-    }
-
-    public String getSayHello2() {
-        return hello2;
-    }
-
-    public void setSayHello(String hello) {
-        this.sayHello = hello;
-        System.out.println("hello world");
-    }
-
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestClass2.java b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestClass2.java
deleted file mode 100644
index 512a7bb..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/test/TestClass2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.javaloader.test;
-
-public class TestClass2 {
-    public static String hello2 = "hello world from testClass2  ";
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml b/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 7b4e941..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,326 +0,0 @@
-<?xml version="1.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.
--->
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
-         version="2.4">
-
-    <description>MyProject web.xml</description>
-
-    <!--optional: context-param>
-        <description>Comma separated list of URIs of (additional) faces config files.
-            (e.g. /WEB-INF/my-config.xml)
-            See JSF 1.0 PRD2, 10.3.2
-            Attention: You do not need to put /WEB-INF/faces-config.xml in here.
-        </description>
-        <param-name>javax.faces.CONFIG_FILES</param-name>
-        <param-value>/WEB-INF/examples-config.xml</param-value>
-    </context-param-->
-
-    <!-- clean method working for myfaces 1.2.8+ -->
-
-    <context-param>
-        <description>
-            Initializes the plugins for our groovy handlers
-        </description>
-        <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
-        <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
-    </context-param>
-
-    <!--
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/groovy
-        </param-value>
-    </context-param>
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp/WEB-INF/java
-        </param-value>
-    </context-param>
-
-
-    <context-param>
-        <description>resource paths for our custom JSF2 resource resolver</description>
-        <param-name>org.apache.myfaces.extensions.scripting.resources.LOADER_PATHS</param-name>
-        <param-value>
-            /Users/werpu2/development/workspace/extension-scripting4/extscript-examples/myfaces12-example/src/main/webapp
-        </param-value>
-    </context-param>
-
-    <context-param>
-         <description>a redirecting Facelet resource resolver which allows to pick up templates and resources from our
-             source dir
-         </description>
-         <param-name>facelets.RESOURCE_RESOLVER</param-name>
-         <param-value>org.apache.myfaces.extensions.scripting.facelet.ReroutingResourceResolver</param-value>
-     </context-param>
-    -->
-    <!--
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</param-name>
-        <param-value>D:/dev/work/ideaprojects/threads/extscript/examples/myfaces12-example/src/main/webapp/WEB-INF/groovy</param-value>
-    </context-param>
-
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</param-name>
-        <param-value>D:/dev/work/ideaprojects/threads/extscript/examples/myfaces12-example/src/main/webapp/WEB-INF/java</param-value>
-    </context-param>
-    -->
-    
-    <context-param>
-        <description>State saving method: "client" or "server" (= default)
-            See JSF Specification 2.5.3
-        </description>
-        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
-        <param-value>server</param-value>
-    </context-param>
-
-    <context-param>
-        <param-name>facelets.LIBRARIES</param-name>
-        <param-value>/WEB-INF/facelets/groovy-taglib.xml</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            Defines the amount (default = 20) of the latest views are stored in session.
-        </description>
-        <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
-        <param-value>20</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            If true (default) the state will be serialized to a byte stream before it
-            is written to the session.
-            If false the state will not be serialized to a byte stream.
-        </description>
-        <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default) and if
-            org.apache.myfaces.SERIALIZE_STATE_IN_SESSION is true (= default)
-            If true (default) the serialized state will be compressed before it
-            is written to the session. If false the state will not be compressed.
-        </description>
-        <param-name>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>This parameter tells MyFaces if javascript code should be allowed in the
-            rendered HTML output.
-            If javascript is allowed, command_link anchors will have javascript code
-            that submits the corresponding form.
-            If javascript is not allowed, the state saving info and nested parameters
-            will be added as url parameters.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
-        <param-value>false</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, rendered HTML code will be formatted, so that it is "human readable".
-            i.e. additional line separators and whitespace will be written, that do not
-            influence the HTML code.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, a javascript function will be rendered that is able to restore the
-            former vertical scroll on every request. Convenient feature if you have pages
-            with long lists and you do not want the browser page to always jump to the top
-            if you trigger a link or button action that stays on the same page.
-            Default: "false"
-        </description>
-        <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Used for encrypting view state. Only relevant for client side
-            state saving. See MyFaces wiki/web site documentation for instructions
-            on how to configure an application for diffenent encryption strengths.
-        </description>
-        <param-name>org.apache.myfaces.SECRET</param-name>
-        <param-value>NzY1NDMyMTA=</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Validate managed beans, navigation rules and ensure that forms are not nested.
-        </description>
-        <param-name>org.apache.myfaces.VALIDATE</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Treat readonly same as if disabled attribute was set for select elements.
-        </description>
-        <param-name>org.apache.myfaces.READONLY_AS_DISABLED_FOR_SELECTS</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Use the defined class as the class which will be called when a resource is added to the
-            ExtensionFilter handling. Using StreamingAddResource here helps with performance. If you want to add
-            custom components and want to use the ExtensionFilter, you need to provide your custom implementation here.
-        </description>
-        <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name>
-        <param-value>org.apache.myfaces.renderkit.html.util.DefaultAddResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Virtual path in the URL which triggers loading of resources for the MyFaces extended components
-            in the ExtensionFilter.
-        </description>
-        <param-name>org.apache.myfaces.RESOURCE_VIRTUAL_PATH</param-name>
-        <param-value>/faces/myFacesExtensionResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Check if the extensions-filter has been properly configured.
-        </description>
-        <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Define partial state saving as true/false.
-        </description>
-        <param-name>javax.faces.PARTIAL_STATE_SAVING_METHOD</param-name>
-        <param-value>false</param-value>
-    </context-param>
-
-    <!-- Use Documents Saved as *.xhtml -->
-    <context-param>
-        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-        <param-value>.xhtml</param-value>
-    </context-param>
-
-    <!-- Special Debug Output for Development -->
-    <context-param>
-        <param-name>facelets.DEVELOPMENT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <!-- Extensions Filter -->
-    <filter>
-        <filter-name>extensionsFilter</filter-name>
-        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
-        <init-param>
-            <description>Set the size limit for uploaded files.
-                Format: 10 - 10 bytes
-                10k - 10 KB
-                10m - 10 MB
-                1g - 1 GB
-            </description>
-            <param-name>uploadMaxFileSize</param-name>
-            <param-value>100m</param-value>
-        </init-param>
-        <init-param>
-            <description>Set the threshold size - files
-                below this limit are stored in memory, files above
-                this limit are stored on disk.
-
-                Format: 10 - 10 bytes
-                10k - 10 KB
-                10m - 10 MB
-                1g - 1 GB
-            </description>
-            <param-name>uploadThresholdSize</param-name>
-            <param-value>100k</param-value>
-        </init-param>
-    </filter>
-
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>extensionsFilter</filter-name>
-        <url-pattern>*.jsf</url-pattern>
-    </filter-mapping>
-    <filter-mapping>
-        <filter-name>extensionsFilter</filter-name>
-        <url-pattern>/faces/*</url-pattern>
-    </filter-mapping>
-
-    <!-- Listener, to allow Jetty serving MyFaces apps -->
-    <listener>
-        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
-    </listener>
-
-    <!-- Faces Servlet -->
-    <servlet>
-        <servlet-name>Faces Servlet</servlet-name>
-        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <!-- Faces Servlet Mapping -->
-    <servlet-mapping>
-        <servlet-name>Faces Servlet</servlet-name>
-        <url-pattern>*.jsf</url-pattern>
-    </servlet-mapping>
-
-    <!-- Welcome files -->
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-        <welcome-file>index.html</welcome-file>
-    </welcome-file-list>
-
-</web-app>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/blog.xhtml b/extscript-examples/myfaces12-example/src/main/webapp/blog.xhtml
deleted file mode 100644
index 3426879..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/blog.xhtml
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
- * 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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
-      xmlns:t="http://myfaces.apache.org/tomahawk" xmlns:grv="http://myfaces.apache.org/groovy">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-<ui:composition template="/template.xhtml">
-
-    <ui:define name="body">
-        <h:messages />
-        <h:form id="form">
-            <h:panelGrid id="grid" columns="1">
-                <h:outputText id="title1" styleClass="title" value="#{blogView.title}"/>
-                <h:outputText id="title11" styleClass="title1" value="#{blogView.title1}"/>
-                <!--
-                entry.firstName = firstName
-                entry.lastName = lastName
-                entry.topic = topic
-                entry.content = content
-            -->
-                <h:outputText value="First Name"/>
-                <h:inputText value="#{blogView.firstName}"/>
-                <h:outputText value="Last Name"/>
-                <h:inputText value="#{blogView.lastName}"/>
-                <h:outputText value="Topic of entry"/>
-                <h:inputText value="#{blogView.topic}"/>
-                <h:outputText value="Content"/>
-                <h:inputText value="#{blogView.content}"/>
-
-
-                <h:commandLink action="#{blogView.addEntry}" value="Add Blog">
-                     <f:ajax execute="@this" render="content"/>
-                </h:commandLink>
-            </h:panelGrid>
-            <h:panelGrid columns="1">
-                <h:outputText value="Blog Entries"/>
-                <ui:repeat value="#{blogService.blogEntries}" var="item">
-                    <h:outputText value="#{item.topic}"/>
-                    <h:outputText value="#{item.content}"/>
-                    <br/>
-                </ui:repeat>
-            </h:panelGrid>
-
-        </h:form>
-    </ui:define>
-</ui:composition>
-</body>
-</html>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/helloWorld.xhtml b/extscript-examples/myfaces12-example/src/main/webapp/helloWorld.xhtml
deleted file mode 100644
index fc6e603..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/helloWorld.xhtml
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
- * 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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
-      xmlns:grv="http://myfaces.apache.org/groovy">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-<ui:composition template="/template.xhtml">
-
-    <ui:define name="body">
-        <h:form id="form">
-
-
-
-            <h:panelGroup styleClass="left">
-                <h:panelGroup styleClass="stdBox">
-                    <h:messages />
-                    <h3>Validator Test 1</h3>
-                    <h:outputText id="output1" value="Please enter your name"/>
-                    <h:inputText id="input1" value="#{helloWorld.name}" required="true">
-                        <grv:groovyvalidator/>
-                    </h:inputText>
-                    <h:commandButton id="button1" value="press me" action="#{helloWorld.send}"/>
-                </h:panelGroup>
-                <h:panelGroup styleClass="stdBox">
-                    <h3>Groovy Component</h3>
-                    <grv:testcomponent/>
-                    <h:message id="message1" for="input1"/>
-                </h:panelGroup>
-            </h:panelGroup>
-            <h:panelGroup styleClass="right">
-                <h:panelGroup styleClass="stdBox">
-                    <h3>Bean Tests</h3>
-                    <h:outputFormat value="#{testbean.xxx}"/>
-                    <br/>
-                    <h:outputFormat value="#{javatestbean.sayHello}"/>
-                </h:panelGroup>
-                <h:panelGroup styleClass="stdBox">
-                    <h3>Action Test 1</h3>
-                    <h:commandButton value="Press me dynamic" action="#{testbean.doit}"/>
-                </h:panelGroup>
-            </h:panelGroup>
-        </h:form>
-    </ui:define>
-</ui:composition>
-</body>
-</html>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/index.jsp b/extscript-examples/myfaces12-example/src/main/webapp/index.jsp
deleted file mode 100644
index 538ff3d..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,23 +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.
--->
-<%@ page session="false" %>
-<%
-    response.sendRedirect("helloWorld.jsf");
-//(new org.apache.myfaces.blank.HelloWorldController()).getName();
-%>
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/javablog.xhtml b/extscript-examples/myfaces12-example/src/main/webapp/javablog.xhtml
deleted file mode 100644
index a7e2014..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/javablog.xhtml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
- * 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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
-      xmlns:t="http://myfaces.apache.org/tomahawk" xmlns:grv="http://myfaces.apache.org/groovy">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-<ui:composition template="/template.xhtml">
-
-    <ui:define name="body">
-
-        <h1>
-            <ui:insert name="title">Ext-Scripting Javablog Example</ui:insert>
-        </h1>
-
-        <h:form id="form">
-
-            <div class="left" style="margin-top: 3px;">
-                <h:panelGrid id="grid" columns="1" styleClass="stdBox">
-                    <h:outputText id="title1" styleClass="title" value="#{javaBlogView.title}"/>
-                    <h:outputText id="title11" styleClass="title1" value="#{javaBlogView.title1}"/>
-
-                    <hr/>
-
-                    <h:panelGrid columns="2" columnClasses="label, input">
-                        <h:outputText value="First Name"/>
-                        <h:inputText value="#{javaBlogView.firstName}"/>
-                        <h:outputText value="Last Name"/>
-                        <h:inputText value="#{javaBlogView.lastName}"/>
-                        <h:outputText value="Topic of entry"/>
-                        <h:inputText value="#{javaBlogView.topic}"/>
-                    </h:panelGrid>
-                    <h:panelGrid columns="2" columnClasses="label, input">
-                        <h:outputText styleClass="label" value="Content"/>
-                        <h:inputTextarea value="#{javaBlogView.content}"/>
-                    </h:panelGrid>
-                    <hr/>
-                    <h:commandButton styleClass="btn" action="#{javaBlogView.addEntry2}" value="Add Blog Entry"/>
-                </h:panelGrid>
-            </div>
-
-            <h:panelGrid columns="1" styleClass="right">
-                <ui:repeat value="#{javaBlogService.blogEntries}" var="item">
-                    <h:panelGrid columns="1" styleClass="messageBox">
-                        <h:panelGroup styleClass="topic">
-                            <h:outputLabel styleClass="label" value="Topic"/>
-                            <h:outputText value="#{item.topic}"/>
-                        </h:panelGroup>
-                        <h:panelGroup styleClass="content">
-                            <h:outputLabel styleClass="label" value="Content"/>
-                            <h:outputFormat escape="false" value="#{item.content}"/>
-                        </h:panelGroup>
-                    </h:panelGrid>
-                    <br/>
-                </ui:repeat>
-            </h:panelGrid>
-
-        </h:form>
-    </ui:define>
-</ui:composition>
-</body>
-</html>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/page2.xhtml b/extscript-examples/myfaces12-example/src/main/webapp/page2.xhtml
deleted file mode 100644
index da80376..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/page2.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
- * 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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-
-<ui:composition template="/template.xhtml">
-
-    <ui:define name="body">
-        <h1>
-            <h:outputText value="Hello #{helloWorld.name}. We hope you enjoy Apache MyFaces Extensions Scripting"/>
-        </h1>
-        <h:form id="form2">
-            <h:panelGrid id="grid" columns="2" styleClass="stdBox">
-
-                <h:commandLink id="link1" action="back">
-                    <h:outputText id="linkText" value="GO HOME"/>
-                </h:commandLink>
-
-            </h:panelGrid>
-        </h:form>
-    </ui:define>
-</ui:composition>
-</body>
-</html>
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient1.jpg b/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient1.jpg
deleted file mode 100644
index 6987743..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient1.jpg
+++ /dev/null
Binary files differ
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient2.png b/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient2.png
deleted file mode 100644
index d10bdcc..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/gradient2.png
+++ /dev/null
Binary files differ
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/license.txt b/extscript-examples/myfaces12-example/src/main/webapp/resources/img/license.txt
deleted file mode 100644
index 507e05e..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/license.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-sig07-009_mac.jpg is from the nasa public domain image archive.
-
-http://www.nasaimages.org/luna/servlet/detail/nasaNAS~12~12~64153~168545:Multiwavelength-M81?qvq=q:galaxy+or+constellation+or+hubble+or+spitzer;lc:NVA2~35~35,NVA2~32~32,NVA2~31~31,NVA2~19~19,nasaNAS~16~16,nasaNAS~2~2,NSVS~3~3,nasaNAS~9~9,NVA2~4~4,NVA2~15~15,NVA2~24~24,NVA2~29~29,nasaNAS~12~12,nasaNAS~8~8,nasaNAS~7~7,NVA2~22~22,nasaNAS~10~10,NVA2~13~13,NVA2~18~18,NVA2~27~27,NVA2~9~9,NVA2~1~1,nasaNAS~6~6,NVA2~25~25,NVA2~20~20,nasaNAS~13~13,nasaNAS~22~22,NVA2~16~16,NVA2~8~8,nasaNAS~5~5,nasaNAS~4~4,NVA2~28~28,NVA2~14~14,nasaNAS~20~20,NVA2~17~17,NVA2~30~30,NVA2~21~21,NVA2~26~26,NVA2~23~23,NVA2~44~44,NVA2~42~42,NVA2~38~38,NVA2~45~45,NVA2~39~39,NVA2~43~43,NVA2~41~41,NVA2~37~37,NVA2~49~49,NVA2~53~53,NVA2~51~51,NVA2~56~56,NVA2~47~47,NVA2~54~54,NVA2~33~33,NVA2~36~36,NVA2~34~34,NVA2~57~57,NVA2~52~52,NVA2~48~48,NVA2~50~50,NVA2~46~46,NVA2~55~55&mi=0&trs=8854
-
-license
-http://www.nasa.gov/audience/formedia/features/MP_Photo_Guidelines.html
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/sig07-009_mac.jpg b/extscript-examples/myfaces12-example/src/main/webapp/resources/img/sig07-009_mac.jpg
deleted file mode 100644
index 42f8ca6..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/resources/img/sig07-009_mac.jpg
+++ /dev/null
Binary files differ
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/resources/styles/main.css b/extscript-examples/myfaces12-example/src/main/webapp/resources/styles/main.css
deleted file mode 100644
index 85c5f10..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/resources/styles/main.css
+++ /dev/null
@@ -1,236 +0,0 @@
-body {
-    background-color: black;
-}
-
-div.centerDiv {
-    margin-left: auto;
-    margin-right: auto;
-    width: 900px;
-}
-
-div.centerDiv form {
-    position: relative;
-}
-
-h1 {
-    color: #9999ff;
-    text-align: center;
-}
-
-div#backGroundFloat {
-    position: fixed;
-    z-index: -1;
-    background-color: black;
-    left: 0px;
-    top: 0px;
-    width: 100%;
-    height: 100%;
-    background-image: url("../img/sig07-009_mac.jpg");
-    background-repeat: no-repeat;
-    overflow: hidden;
-}
-
-#hello {
-    background-color: yellow;
-}
-
-.stdBox, .messageBox {
-    display: block;
-    width: 400px;
-    border: 1px solid white;
-    -moz-border-radius: 10px;
-    -webkit-border-radius: 10px;
-    padding: 5px;
-    border-radius: 8px;
-    background-repeat: repeat-x;
-    margin-bottom: 5px;
-    min-height: 120px;
-
-}
-
-.stdBox {
-    background-color: white;
-    background-image: url("../img/gradient1.jpg");
-}
-
-.messageBox {
-    background-image: url("../img/gradient2.png");
-}
-
-
-/*==================================================
-    Basic CSS information for our
-    taint history component
-    we do not use the compound
-    css for error and history
-    for readability reasons
-    although we have  load
-    of duplication here
-====================================================*/
-
-div.historyBox {
-    width: 820px;
-    heigh: 200px;
-
-    display: block;
-    overflow: auto;
-    border: 1px solid white;
-    color: #dedddd;
-    opacity: 0.92;
-
-    -moz-border-radius: 10px;
-    -webkit-border-radius: 10px;
-    border-radius: 5px;
-
-    padding: 5px;
-    margin-left: 10px;
-
-    background-image: url("../img/gradient2.png");
-    background-repeat: repeat-x;
-}
-
-div.historyBox .line {
-    display: table;
-    width: 780px;
-
-    border: 1px dashed black;
-    background-color: #ccccff;
-    color: black;
-    padding: 5px;
-    margin-top: 10px;
-    margin-left: auto;
-    margin-right: auto;
-    -moz-border-radius: 5px;
-    -webkit-border-radius: 5px;
-
-    border-radius: 5px;
-}
-
-div.historyBox .line .timestamp {
-    width: 120px;
-    float: left;
-    color: red;
-}
-
-div.historyBox .line .changedFile {
-    width: 650px;
-    overflow: hidden;
-    display: block;
-    float: left;
-}
-
-/*==================================================
-    Basic CSS information for our compiler
-    output component
-====================================================*/
-
-div.errorsLabel {
-    font-size: large;
-    padding-top: 5px;
-    padding-bottom: 10px;
-    padding-left: 5px;
-}
-
-div.warningsLabel {
-    font-size: large;
-    padding-top: 5px;
-    padding-bottom: 10px;
-    padding-left: 5px;
-    width: 100%;
-    margin-top: 10px;
-    border-top: 1px solid black;
-}
-
-div.errorBox {
-    width: 820px;
-    heigh: 200px;
-
-    display: block;
-    overflow: auto;
-    border: 1px solid white;
-    color: #dedddd;
-    opacity: 0.92;
-
-    -moz-border-radius: 10px;
-    -webkit-border-radius: 10px;
-    border-radius: 5px;
-
-    padding: 5px;
-    margin-left: 10px;
-
-    background-image: url("../resources/img/gradient2.png");
-    background-repeat: repeat-x;
-}
-
-div.errorBox .line {
-    display: table;
-    width: 780px;
-
-    border: 1px dashed black;
-    background-color: #ccccff;
-    color: black;
-    padding: 5px;
-    margin-top: 10px;
-    margin-left: auto;
-    margin-right: auto;
-    -moz-border-radius: 5px;
-    -webkit-border-radius: 5px;
-
-    border-radius: 5px;
-}
-
-div.errorBox .line .lineNo {
-    width: 40px;
-    float: left;
-    color: red;
-}
-
-div.errorBox .line .lineNo {
-    width: 30px;
-    float: left;
-    padding-left: 5px;
-    font-weight: bold;
-    font-size: large;
-}
-
-div.errorBox .line .message {
-    width: 738px;
-    display: block;
-    float: left;
-}
-
-.left {
-    position: absolute;
-    left: 10px;
-    top: 20px;
-}
-
-.right {
-    position: absolute;
-    left: 430px;
-    top: 20px;
-}
-
-.label {
-    font-weight: bold;
-    color: black;
-    width: 150px;
-    padding-right: 5px;
-}
-
-.input input, .input textArea {
-    width: 200px;
-}
-
-input, textArea {
-    border: 1px solid black;
-}
-
-input:focus, textArea:focus {
-    background-color: yellow;
-}
-
-input.btn {
-    width: 100px;
-    margin-left: 263px;
-}
\ No newline at end of file
diff --git a/extscript-examples/myfaces12-example/src/main/webapp/template.xhtml b/extscript-examples/myfaces12-example/src/main/webapp/template.xhtml
deleted file mode 100644
index dcd66a4..0000000
--- a/extscript-examples/myfaces12-example/src/main/webapp/template.xhtml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
- * 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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core"
-      xmlns:exs="http://myfaces.apache.org/ext-scripting"
-      xmlns:h="http://java.sun.com/jsf/html">
-<head>
-
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
-    <title>Myfaces Example Facelets</title>
-
-    <link type="text/css" rel="stylesheet" href="./resources/styles/main.css"/>
-
-
-</head>
-
-<body>
-<div id="backGroundFloat">
-
-</div>
-<div class="centerDiv">
-    <h:panelGroup>
-        <h3>
-            <h:outputFormat value="Compiler Output" escape="false"/>
-        </h3>
-        <exs:compilerOutput errorsLabel="Errors:" warningsLabel="Warnings:" scriptingLanguage=""/>
-    </h:panelGroup>
-
-    <p>
-        <ui:insert name="body">Hello World Example!</ui:insert>
-    </p>
-</div>
-
-</body>
-
-</html>
diff --git a/extscript-examples/spring-example/pom.xml b/extscript-examples/spring-example/pom.xml
deleted file mode 100644
index 0e37193..0000000
--- a/extscript-examples/spring-example/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project>
-    <parent>
-        <artifactId>extscript-examples</artifactId>
-        <groupId>org.apache.myfaces.extensions.scripting</groupId>
-        <version>1.0.2-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.myfaces.extensions.scripting</groupId>
-    <artifactId>spring-example</artifactId>
-    <packaging>war</packaging>
-    <name>A custom project using myfaces and spring</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <url>http://www.apache.org</url>
-
-    <properties>
-          <spring.version>3.0.2.RELEASE</spring.version>
-    </properties>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-examples/spring-example</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-examples/spring-example</developerConnection>
-        <url>http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/spring-example</url>
-    </scm>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-all</artifactId>
-            <version>${groovy.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.extensions.scripting</groupId>
-            <artifactId>extscript-myfaces20-bundle</artifactId>
-            <version>1.0.2-SNAPSHOT</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>${myfaces2.version}</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-impl</artifactId>
-            <version>${myfaces2.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-web</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>cglib</groupId>
-            <artifactId>cglib-nodep</artifactId>
-            <version>2.2</version>
-        </dependency>
-        <dependency>
-            <groupId>antlr</groupId>
-            <artifactId>antlr</artifactId>
-            <version>2.7.7</version>
-        </dependency>
-        <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>antlr</artifactId>
-            <version>3.0.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjrt</artifactId>
-            <version>1.6.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <version>1.6.8</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/HelloWorldBacking.java b/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/HelloWorldBacking.java
deleted file mode 100644
index a41594b..0000000
--- a/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/HelloWorldBacking.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.springTest;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * A typical simple backing bean, that is backed to <code>helloworld.jsp</code>
- *
- * @author <a href="mailto:matzew@apache.org">Matthias We�endorf</a>
- */
-@Component("helloWorldBacking")
-@Scope("session")
-@Lazy
-public class HelloWorldBacking {
-
-    @Autowired
-    SpringBean springBean;
-
-
-    //properties
-    private String name;
-
-    /**
-     * default empty constructor
-     */
-    public HelloWorldBacking() {
-    }
-
-    //-------------------getter & setter
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public SpringBean getSpringBean() {
-        return springBean;
-    }
-
-    public void setSpringBean(SpringBean springBean) {
-        this.springBean = springBean;
-    }
-
-    /**
-     * Method that is backed to a submit button of a form.
-     */
-    public String send() {
-        //do real logic
-        this.name = springBean.getValue();
-        return ("success");
-    }
-}
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/SpringBean.java b/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/SpringBean.java
deleted file mode 100644
index 5bf3554..0000000
--- a/extscript-examples/spring-example/src/main/java/org/apache/myfaces/springTest/SpringBean.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.myfaces.springTest;
-
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-@Component("springBean")
-@Scope("request")
-@Lazy
-public class SpringBean {
-    private String value = "hello world from the spring bean";
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-}
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/applicationContext.xml b/extscript-examples/spring-example/src/main/webapp/WEB-INF/applicationContext.xml
deleted file mode 100644
index bfd7054..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/applicationContext.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:tx="http://www.springframework.org/schema/tx"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-           http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
-    <context:component-scan base-package="org.apache.myfaces.springTest" scoped-proxy="targetClass"/>
-    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
-    
-
-
-</beans>
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/faces-config.xml b/extscript-examples/spring-example/src/main/webapp/WEB-INF/faces-config.xml
deleted file mode 100644
index 0ca2727..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.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.
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
-              version="2.0">
-
-
-
-    <!-- managed beans of the simple hello world app -->
-    <!--
-    <managed-bean>
-        <managed-bean-name>helloWorldBacking</managed-bean-name>
-        <managed-bean-class>
-            org.apache.myfaces.springTest.HelloWorldBacking
-        </managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-    </managed-bean>
-    -->
-    <!--
-
-    <managed-bean>
-        <managed-bean-name>groovyBean</managed-bean-name>
-        <managed-bean-class>org.apache.myfaces.groovy.GroovyBean</managed-bean-class>
-        <managed-bean-scope>request</managed-bean-scope>
-        <managed-property>
-            <property-name>secondBean</property-name>
-            <value>#{springBean}</value>
-        </managed-property>
-    </managed-bean>
-     -->
-    
-    <!-- navigation rules for helloWorld.jsp -->
-    <navigation-rule>
-        <from-view-id>/helloWorld.xhtml</from-view-id>
-        <navigation-case>
-            <from-outcome>success</from-outcome>
-            <to-view-id>/page2.xhtml</to-view-id>
-        </navigation-case>
-    </navigation-rule>
-
-    <!-- navigation rules for page2.jsp -->
-    <navigation-rule>
-        <from-view-id>/page2.xhtml</from-view-id>
-        <navigation-case>
-            <from-outcome>back</from-outcome>
-            <to-view-id>/helloWorld.xhtml</to-view-id>
-        </navigation-case>
-    </navigation-rule>
-
-     <application>
-       <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
-    </application>
-</faces-config>
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy-taglib.xml b/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy-taglib.xml
deleted file mode 100644
index d345e6f..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy-taglib.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
-<facelet-taglib>
-    <!-- author: werner.punz@irian.at -->
-
-    <namespace>http://myfaces.apache.org/groovy</namespace>
-    <tag>
-        <tag-name>groovyvalidator</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.groovyloader.test.TestValidator</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>groovyconverter</tag-name>
-        <converter>
-            <converter-id>org.apache.myfaces.groovyloader.test.TestConverter</converter-id>
-        </converter>
-    </tag>
-    <tag>
-        <tag-name>testcomponent</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.groovyloader.test.TestComponent</component-type>
-            <renderer-type>org.apache.myfaces.groovyloader.test.Test</renderer-type>
-        </component>
-    </tag>
-</facelet-taglib>
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovy/GroovyBean.groovy b/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovy/GroovyBean.groovy
deleted file mode 100644
index 458a7d1..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovy/GroovyBean.groovy
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.myfaces.groovy
-
-import org.apache.myfaces.springTest.SpringBean
-import org.apache.myfaces.springTest.SpringBean;
-
-public class GroovyBean {
-  String value = "Hello world from the groovy bean"
-  SpringBean secondBean = null
-}
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/tomahawk.taglib.xml b/extscript-examples/spring-example/src/main/webapp/WEB-INF/tomahawk.taglib.xml
deleted file mode 100644
index b9fc141..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/tomahawk.taglib.xml
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
-<facelet-taglib>
-    <!-- author: thomas.jachmann@mindmatters.de -->
-    <namespace>http://myfaces.apache.org/tomahawk</namespace>
-    <tag>
-        <tag-name>commandButton</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandButton</component-type>
-            <renderer-type>org.apache.myfaces.Button</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandLink</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandLink</component-type>
-            <renderer-type>org.apache.myfaces.Link</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataTable</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataTable</component-type>
-            <renderer-type>org.apache.myfaces.Table</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputHidden</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputHidden</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputSecret</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputSecret</component-type>
-            <renderer-type>org.apache.myfaces.Secret</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputText</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputText</component-type>
-            <renderer-type>org.apache.myfaces.Text</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputTextHelp</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputTextHelp</component-type>
-            <renderer-type>org.apache.myfaces.TextHelp</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputTextarea</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputTextarea</component-type>
-            <renderer-type>org.apache.myfaces.Textarea</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>graphicImage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlGraphicImage</component-type>
-            <renderer-type>org.apache.myfaces.Image</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>message</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlMessage</component-type>
-            <renderer-type>org.apache.myfaces.Message</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>messages</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlMessages</component-type>
-            <renderer-type>org.apache.myfaces.Messages</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>outputLabel</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlOutputLabel</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>outputText</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlOutputText</component-type>
-            <renderer-type>org.apache.myfaces.Text</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelGrid</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelGrid</component-type>
-            <renderer-type>org.apache.myfaces.Grid</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelGroup</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelGroup</component-type>
-            <renderer-type>org.apache.myfaces.Group</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneMenu</component-type>
-            <renderer-type>org.apache.myfaces.Menu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyMenu</component-type>
-            <renderer-type>org.apache.myfaces.Menu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneRadio</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneRadio</component-type>
-            <renderer-type>org.apache.myfaces.Radio</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectBooleanCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectBooleanCheckbox</component-type>
-            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyCheckbox</component-type>
-            <renderer-type>org.apache.myfaces.Checkbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneListbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectOneListbox</component-type>
-            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectManyListbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSelectManyListbox</component-type>
-            <renderer-type>org.apache.myfaces.Listbox</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputCalendar</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputCalendar</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jsValueChangeListener</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.JsValueChangeListener</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jsValueSet</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlJsValueSet</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>checkbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCheckbox</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandNavigation</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandNavigation</component-type>
-            <renderer-type>org.apache.myfaces.Navigation</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandNavigation2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandNavigationItem</component-type>
-            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>commandSortHeader</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCommandSortHeader</component-type>
-            <renderer-type>org.apache.myfaces.SortHeader</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataList</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataList</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>dataScroller</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlDataScroller</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputDate</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputDate</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputFileUpload</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlInputFileUpload</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>inputHtml</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.InputHtml</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>navigationMenuItem</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.NavigationMenuItem</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>navigationMenuItems</tag-name>
-        <component>
-            <component-type>javax.faces.SelectItems</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>jscookMenu</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.JSCookMenu</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelLayout</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelLayout</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelNavigation</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelNavigation</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelNavigation2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelNavigationMenu</component-type>
-            <renderer-type>org.apache.myfaces.NavigationMenu</renderer-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelTab</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelTab</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelTabbedPane</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelTabbedPane</component-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>tabChangeListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>collapsiblePanel</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlCollapsiblePanel</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneCountry</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SelectOneCountry</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>selectOneLanguage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SelectOneLanguage</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>stylesheet</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Stylesheet</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>div</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Div</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>htmlTag</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTag</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>radio</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlRadio</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>tree</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTree</component-type>
-            <renderer-type>org.apache.myfaces.HtmlTree</renderer-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>treeSelectionListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <!-- deactivated since there's no component! tag>
-        <tag-name>iconProvider</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>treeColumn</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTreeColumn</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>treeCheckbox</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTreeCheckbox</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>tree2</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlTree2</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>panelStack</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPanelStack</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>popup</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlPopup</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>newspaperTable</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlNewspaperTable</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>aliasBean</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.AliasBean</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>aliasBeansScope</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.AliasBeansScope</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>buffer</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.Buffer</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>saveState</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.SaveState</component-type>
-        </component>
-    </tag>
-    <!-- deactivated since there's no component! tag>
-        <tag-name>updateActionListener</tag-name>
-        <component>
-        <component-type></component-type>
-        </component>
-        </tag-->
-    <tag>
-        <tag-name>validateCreditCard</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.CreditCard</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>validateEmail</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.Email</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>validateEqual</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.Equal</validator-id>
-        </validator>
-    </tag>
-    <tag>
-        <tag-name>swapImage</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlSwapImage</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>columns</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlColumns</component-type>
-        </component>
-    </tag>
-    <tag>
-        <tag-name>column</tag-name>
-        <component>
-            <component-type>org.apache.myfaces.HtmlColumn</component-type>
-        </component>
-    </tag>
-    <!-- additional validators (note: not in tld, so no code completion) -->
-    <tag>
-        <tag-name>validateRegExpr</tag-name>
-        <validator>
-            <validator-id>org.apache.myfaces.validator.RegExpr</validator-id>
-        </validator>
-    </tag>
-</facelet-taglib>
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/webapp/WEB-INF/web.xml b/extscript-examples/spring-example/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 77856f7..0000000
--- a/extscript-examples/spring-example/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,266 +0,0 @@
-<?xml version="1.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.
--->
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
-         version="2.4">
-
-    <description>MyProject web.xml</description>
-
-    <!--optional: context-param>
-        <description>Comma separated list of URIs of (additional) faces config files.
-            (e.g. /WEB-INF/my-config.xml)
-            See JSF 1.0 PRD2, 10.3.2
-            Attention: You do not need to put /WEB-INF/faces-config.xml in here.
-        </description>
-        <param-name>javax.faces.CONFIG_FILES</param-name>
-        <param-value>/WEB-INF/faces-config.xml</param-value>
-    </context-param-->
-
-
-    <context-param>
-        <param-name>contextConfigLocation</param-name>
-        <param-value>/WEB-INF/applicationContext.xml</param-value>
-    </context-param>
-    <listener>
-        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-    </listener>
-    <listener>
-        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
-    </listener>
-    <!-- clean method working for myfaces 1.2.8+ -->
-
-    <context-param>
-        <description>
-            Initializes the plugins for our groovy handlers
-        </description>
-        <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
-        <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</param-name>
-        <param-value>/Users/werpu2/development/workspace/extension-scripting4/extscript-examples/spring-example/src/main/webapp/WEB-INF/groovy
-        </param-value>
-    </context-param>
-
-    <context-param>
-        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
-            of the deployment dir
-        </description>
-        <param-name>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</param-name>
-        <param-value>/Users/werpu2/development/workspace/extension-scripting4/extscript-examples/spring-example/src/main/java
-        </param-value>
-    </context-param>
-
-    <context-param>
-        <description>State saving method: "client" or "server" (= default)
-            See JSF Specification 2.5.3
-        </description>
-        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
-        <param-value>server</param-value>
-    </context-param>
-
-    <context-param>
-        <param-name>facelets.LIBRARIES</param-name>
-        <param-value>/WEB-INF/tomahawk.taglib.xml;/WEB-INF/groovy-taglib.xml</param-value>
-    </context-param>
-
-
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            Defines the amount (default = 20) of the latest views are stored in session.
-        </description>
-        <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
-        <param-value>20</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default).
-            If true (default) the state will be serialized to a byte stream before it
-            is written to the session.
-            If false the state will not be serialized to a byte stream.
-        </description>
-        <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>Only applicable if state saving method is "server" (= default) and if
-            org.apache.myfaces.SERIALIZE_STATE_IN_SESSION is true (= default)
-            If true (default) the serialized state will be compressed before it
-            is written to the session. If false the state will not be compressed.
-        </description>
-        <param-name>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>This parameter tells MyFaces if javascript code should be allowed in the
-            rendered HTML output.
-            If javascript is allowed, command_link anchors will have javascript code
-            that submits the corresponding form.
-            If javascript is not allowed, the state saving info and nested parameters
-            will be added as url parameters.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
-        <param-value>false</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, rendered HTML code will be formatted, so that it is "human readable".
-            i.e. additional line separators and whitespace will be written, that do not
-            influence the HTML code.
-            Default: "true"
-        </description>
-        <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <description>If true, a javascript function will be rendered that is able to restore the
-            former vertical scroll on every request. Convenient feature if you have pages
-            with long lists and you do not want the browser page to always jump to the top
-            if you trigger a link or button action that stays on the same page.
-            Default: "false"
-        </description>
-        <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>Used for encrypting view state. Only relevant for client side
-            state saving. See MyFaces wiki/web site documentation for instructions
-            on how to configure an application for diffenent encryption strengths.
-        </description>
-        <param-name>org.apache.myfaces.SECRET</param-name>
-        <param-value>NzY1NDMyMTA=</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Validate managed beans, navigation rules and ensure that forms are not nested.
-        </description>
-        <param-name>org.apache.myfaces.VALIDATE</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Treat readonly same as if disabled attribute was set for select elements.
-        </description>
-        <param-name>org.apache.myfaces.READONLY_AS_DISABLED_FOR_SELECTS</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Use the defined class as the class which will be called when a resource is added to the
-            ExtensionFilter handling. Using StreamingAddResource here helps with performance. If you want to add
-            custom components and want to use the ExtensionFilter, you need to provide your custom implementation here.
-        </description>
-        <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name>
-        <param-value>org.apache.myfaces.renderkit.html.util.DefaultAddResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Virtual path in the URL which triggers loading of resources for the MyFaces extended components
-            in the ExtensionFilter.
-        </description>
-        <param-name>org.apache.myfaces.RESOURCE_VIRTUAL_PATH</param-name>
-        <param-value>/faces/myFacesExtensionResource</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Check if the extensions-filter has been properly configured.
-        </description>
-        <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <context-param>
-        <description>
-            Define partial state saving as true/false.
-        </description>
-        <param-name>javax.faces.PARTIAL_STATE_SAVING_METHOD</param-name>
-        <param-value>false</param-value>
-    </context-param>
-
-    <!-- Use Documents Saved as *.xhtml -->
-    <context-param>
-        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-        <param-value>.xhtml</param-value>
-    </context-param>
-
-    <!-- Special Debug Output for Development -->
-    <context-param>
-        <param-name>facelets.DEVELOPMENT</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-
-    <!-- Extensions Filter -->
-
-
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
-    <!-- Listener, to allow Jetty serving MyFaces apps -->
-    <listener>
-        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
-    </listener>
-
-
-    <!-- Faces Servlet -->
-    <servlet>
-        <servlet-name>Faces Servlet</servlet-name>
-        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <!-- Faces Servlet Mapping -->
-    <servlet-mapping>
-        <servlet-name>Faces Servlet</servlet-name>
-        <url-pattern>*.jsf</url-pattern>
-    </servlet-mapping>
-
-    <!-- Welcome files -->
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-        <welcome-file>index.html</welcome-file>
-    </welcome-file-list>
-
-</web-app>
diff --git a/extscript-examples/spring-example/src/main/webapp/helloWorld.xhtml b/extscript-examples/spring-example/src/main/webapp/helloWorld.xhtml
deleted file mode 100644
index 0d12e2c..0000000
--- a/extscript-examples/spring-example/src/main/webapp/helloWorld.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core"
-      xmlns:h="http://java.sun.com/jsf/html">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-<ui:composition template="/template.xhtml">
-
-    <ui:define name="body">
-        <h:form id="form">
-            <h:panelGrid id="grid" columns="2">
-                <h:outputText id="output1" value="Please enter your name"/>
-                 <h:outputText id="input1x" value="#{helloWorldBacking.springBean.value}" />
-                <h:inputText id="input1" value="#{helloWorldBacking.name}"
-                             required="true"/>
-                <h:commandButton id="button1" value="press me"
-                                 action="#{helloWorldBacking.send}"/>
-                <h:message id="message1" for="input1"/>
-
-                <!--
-                <h:outputText value="#{groovyBean.value}"/>
-
-                <h:outputText value="#{groovyBean.secondBean.value}"/>
-                -->
-            </h:panelGrid>
-        </h:form>
-    </ui:define>
-</ui:composition>
-</body>
-</html>
diff --git a/extscript-examples/spring-example/src/main/webapp/index.jsp b/extscript-examples/spring-example/src/main/webapp/index.jsp
deleted file mode 100644
index 330de79..0000000
--- a/extscript-examples/spring-example/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,4 +0,0 @@
-<%@ page session="false" %>
-<%
-    response.sendRedirect("helloWorld.jsf");
-%>
\ No newline at end of file
diff --git a/extscript-examples/spring-example/src/main/webapp/page2.xhtml b/extscript-examples/spring-example/src/main/webapp/page2.xhtml
deleted file mode 100644
index fc0bd3c..0000000
--- a/extscript-examples/spring-example/src/main/webapp/page2.xhtml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core"
-      xmlns:h="http://java.sun.com/jsf/html">
-<head>
-    <title>Hello World</title>
-</head>
-<body>
-
-<f:view>
-    <h:outputText
-            value="Hello #{helloWorldBacking.name}. We hope you enjoy Apache MyFaces"/>
-    <h:form id="form2">
-        <h:commandLink id="link1" action="back">
-            <h:outputText id="linkText" value="GO HOME"/>
-        </h:commandLink>
-    </h:form>
-</f:view>
-</body>
-</html>
diff --git a/extscript-examples/spring-example/src/main/webapp/template.xhtml b/extscript-examples/spring-example/src/main/webapp/template.xhtml
deleted file mode 100644
index 6bb2788..0000000
--- a/extscript-examples/spring-example/src/main/webapp/template.xhtml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:ui="http://java.sun.com/jsf/facelets"
-      xmlns:f="http://java.sun.com/jsf/core"
-      xmlns:h="http://java.sun.com/jsf/html">
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
-    <title>Myfaces Example Facelets</title>
-</head>
-
-<body>
-<h1>
-    <ui:insert name="title">Myfaces Example Facelets</ui:insert>
-</h1>
-<p>
-    <ui:insert name="body">Hello World Example!</ui:insert>
-</p>
-</body>
-
-</html>
