diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationExceptionTest.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationExceptionTest.java
index 593b843..89b4d63 100644
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationExceptionTest.java
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationExceptionTest.java
@@ -19,8 +19,8 @@
 
 package rewrite.org.apache.myfaces.extensions.scripting.scanningcore.engine.compiler;
 
-import org.apache.myfaces.extensions.scripting.api.CompilationException;
 import org.junit.Test;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.CompilationException;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationResultTest.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationResultTest.java
index 44a8576..371e1d1 100644
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationResultTest.java
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/CompilationResultTest.java
@@ -19,9 +19,9 @@
 
 package rewrite.org.apache.myfaces.extensions.scripting.scanningcore.engine.compiler;
 
-import org.apache.myfaces.extensions.scripting.api.CompilationResult;
 import org.junit.Before;
 import org.junit.Test;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult;
 
 import static junit.framework.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/AbstractGeneratorTestCase.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/AbstractGeneratorTestCase.java
index 679bcca..c5723bf 100644
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/AbstractGeneratorTestCase.java
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/AbstractGeneratorTestCase.java
@@ -19,10 +19,10 @@
 package rewrite.org.apache.myfaces.extensions.scripting.scanningcore.support;
 
 import junit.framework.TestCase;
-import org.apache.myfaces.extensions.scripting.api.CompilationException;
-import org.apache.myfaces.extensions.scripting.api.CompilationResult;
-import org.apache.myfaces.extensions.scripting.sandbox.compiler.Compiler;
-import org.apache.myfaces.extensions.scripting.sandbox.compiler.CompilerFactory;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.CompilationException;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.compiler.JSR199Compiler;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.Compiler;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -115,22 +115,28 @@
         }
     }
 
-    protected CompilationResult compileFile(String sourcePath, String targetPath, String fileName, String[] fileContent)
-            throws IOException, CompilationException {
-        return compileFile(CompilerFactory.createCompiler(),
-                new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName, fileContent);
+    /*protected CompilationResult compileFile(String sourcePath, String targetPath, String fileName,
+                                             String[] fileContent)
+            throws IOException, CompilationException
+    {
+        return compileFile(new JSR199Compiler(),
+                new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName,
+            fileContent);
     }
 
     protected CompilationResult compileFile(String sourcePath, String targetPath, String fileName, String[] fileContent, ClassLoader classLoader)
             throws IOException, CompilationException {
-        return compileFile(CompilerFactory.createCompiler(),
-                new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName, fileContent, classLoader);
+            return compileFile(new JSR199Compiler(),
+              new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName,
+                fileContent, classLoader);
     }
 
-    protected CompilationResult compileFile(Compiler compiler, String sourcePath, String targetPath, String fileName, String[] fileContent)
+    protected CompilationResult compileFile(Compiler compiler, String sourcePath, String targetPath,
+                                             String fileName, String[] fileContent)
             throws IOException, CompilationException {
-        return compileFile(compiler,
-                new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName, fileContent);
+            return compileFile(compiler,
+                new File(buildAbsolutePath(sourcePath)), new File(buildAbsolutePath(targetPath)), fileName,
+                fileContent);
     }
 
     protected CompilationResult compileFile(Compiler compiler, File sourcePath, File targetPath, String fileName, String[] fileContent)
@@ -146,7 +152,7 @@
         assertFalse("Compilation errors: " + result.getErrors().toString(), result.hasErrors());
 
         return result;
-    }
+    }  */
 
     /**
      * <p>Concatenates the given relative path and the path of the test directory. In doing so
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/ContextUtils.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/ContextUtils.java
deleted file mode 100644
index 1672b27..0000000
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/ContextUtils.java
+++ /dev/null
@@ -1,84 +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 rewrite.org.apache.myfaces.extensions.scripting.scanningcore.support;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.myfaces.extensions.scripting.api.DynamicCompiler;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContextInitializer;
-import org.apache.myfaces.extensions.scripting.loaders.java.compiler.CompilerFacade;
-
-import java.io.File;
-import java.io.IOException;
-
-import static org.junit.Assert.fail;
-
-/**
- * Context utils which store the reusable test code
- *
- * @author Werner Punz (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public class ContextUtils {
-
-    /**
-     * locking monitor for the compile/load parts
-     */
-    public static volatile Boolean COMPILE_LOAD_MONITOR = new Boolean(true);
-
-    /**
-     * A startup routine shared by many tests
-     * to do the basic weaving initialization
-     *
-     * @return the mockup servlet context
-     */
-    public static MockServletContext startupSystem() {
-        MockServletContext context = new MockServletContext();
-        WeavingContextInitializer.initWeavingContext(context);
-        return context;
-    }
-
-    /**
-     * same as the other one but with a web.xml path being possible
-     *
-     * @param webXmlPath the path to the web.xml
-     * @return the servlet context
-     */
-    public static MockServletContext startupSystem(String webXmlPath) {
-        MockServletContext context = new MockServletContext(webXmlPath);
-        WeavingContextInitializer.initWeavingContext(context);
-        return context;
-    }
-
-    public static File doJavaRecompile(String sourceRoot) throws ClassNotFoundException {
-        synchronized (COMPILE_LOAD_MONITOR) {
-
-            DynamicCompiler compiler = new CompilerFacade(false);
-            try {
-                FileUtils.deleteDirectory(WeavingContext.getConfiguration().getCompileTarget());
-            } catch (IOException e) {
-                fail(e.getMessage());
-            }
-            WeavingContext.getConfiguration().getCompileTarget().mkdirs();
-            return compiler.compileAllFiles(sourceRoot, "");
-        }
-    }
-
-}
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/MockServletContext.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/MockServletContext.java
index 8e28aca..8af6f5a 100644
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/MockServletContext.java
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/support/MockServletContext.java
@@ -19,8 +19,9 @@
 
 package rewrite.org.apache.myfaces.extensions.scripting.scanningcore.support;
 
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader;
+
+import rewrite.org.apache.myfaces.extensions.scripting.core.api.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.jsf.startup.StartupServletContextPluginChainLoader;
 
 import java.io.File;
 import java.util.HashMap;
