diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/Configuration.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/Configuration.java
index f29b228..ba55da2 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/Configuration.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/Configuration.java
@@ -25,6 +25,8 @@
 
 import javax.servlet.ServletContext;
 import java.io.File;
+import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
@@ -39,7 +41,8 @@
 
 public class Configuration
 {
-   List<String> _additionalClassPath = new CopyOnWriteArrayList<String>();
+    private static final String WEB_INF_CLASSES = "/WEB-INF/classes";
+    List<String> _additionalClassPath = new CopyOnWriteArrayList<String>();
     /**
      * the package whitelist used by our system
      * to determine which packages are under control.
@@ -56,10 +59,9 @@
      */
     volatile List<String> _resourceDirs = new CopyOnWriteArrayList<String>();
 
-
-
     String _initialCompile;
 
+    WeakReference<ServletContext> _contextWeakReference = null;
 
     /**
      * the target compile path
@@ -83,24 +85,27 @@
     public void init(ServletContext context)
     {
         String packageWhiteList = context.getInitParameter(INIT_PARAM_SCRIPTING_PACKAGE_WHITELIST);
-        packageWhiteList = (packageWhiteList == null)? "": packageWhiteList;
+        packageWhiteList = (packageWhiteList == null) ? "" : packageWhiteList;
         _packageWhiteList.addAll(Arrays.asList(packageWhiteList.split("\\,")));
 
         String additionalClassPath = context.getInitParameter(INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH);
-        additionalClassPath = (additionalClassPath == null)? "": additionalClassPath;
-        String [] additionalClassPaths = additionalClassPath.split("\\,");
+        additionalClassPath = (additionalClassPath == null) ? "" : additionalClassPath;
+        String[] additionalClassPaths = additionalClassPath.split("\\,");
         _additionalClassPath.addAll(Arrays.asList(additionalClassPaths));
 
         String resourcePath = context.getInitParameter(INIT_PARAM_RESOURCE_PATH);
-        resourcePath = (resourcePath == null)? "": resourcePath;
+        resourcePath = (resourcePath == null) ? "" : resourcePath;
         _resourceDirs.addAll(Arrays.asList(resourcePath.split("\\,")));
 
         _initialCompile = context.getInitParameter(INIT_PARAM_INITIAL_COMPILE);
         //_additionalClassPath = context.getInitParameter(INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH);
 
-        for(ScriptingEngine engine: FactoryEngines.getInstance().getEngines()) {
+        for (ScriptingEngine engine : FactoryEngines.getInstance().getEngines())
+        {
             engine.init(context);
         }
+
+        _contextWeakReference = new WeakReference<ServletContext>(context);
     }
 
     public String getFileEnding(int scriptingEngine)
@@ -121,46 +126,52 @@
         return WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths();
     }
 
-        /**
-         * returns a set of whitelisted subdirs hosting the source
-         *
-         * @param scriptingEngine the scripting engine for which the dirs have to be determined
-         *                        (note every scripting engine has a unique integer value)
-         * @return the current whitelisted dirs hosting the sources
-         */
-        public Collection<String> getWhitelistedSourceDirs(int scriptingEngine) {
-            Collection<String> origSourceDirs = getSourceDirs(scriptingEngine);
-            if (_packageWhiteList.isEmpty()) {
-                return origSourceDirs;
-            }
-
-            return mergeWhitelisted(origSourceDirs);
+    /**
+     * returns a set of whitelisted subdirs hosting the source
+     *
+     * @param scriptingEngine the scripting engine for which the dirs have to be determined
+     *                        (note every scripting engine has a unique integer value)
+     * @return the current whitelisted dirs hosting the sources
+     */
+    public Collection<String> getWhitelistedSourceDirs(int scriptingEngine)
+    {
+        Collection<String> origSourceDirs = getSourceDirs(scriptingEngine);
+        if (_packageWhiteList.isEmpty())
+        {
+            return origSourceDirs;
         }
 
-        /**
-         * merges the whitelisted packages with the sourcedirs and generates a final list
-         * which left join of both sets - the ones which do not exist in reality
-         *
-         * @param origSourceDirs the original source dirs
-         * @return the joined existing subset of all directories which exist
-         */
-        private Collection<String> mergeWhitelisted(Collection<String> origSourceDirs) {
-            List<String> retVal = new ArrayList<String>(_packageWhiteList.size() * origSourceDirs.size() + origSourceDirs.size());
+        return mergeWhitelisted(origSourceDirs);
+    }
 
-            for (String whitelisted : _packageWhiteList) {
-                whitelisted = whitelisted.replaceAll("\\.", FileUtils.getFileSeparatorForRegex());
-                for (String sourceDir : origSourceDirs) {
-                    String newSourceDir = sourceDir + File.separator + whitelisted;
-                    if ((new File(newSourceDir)).exists()) {
-                        retVal.add(newSourceDir);
-                    }
+    /**
+     * merges the whitelisted packages with the sourcedirs and generates a final list
+     * which left join of both sets - the ones which do not exist in reality
+     *
+     * @param origSourceDirs the original source dirs
+     * @return the joined existing subset of all directories which exist
+     */
+    private Collection<String> mergeWhitelisted(Collection<String> origSourceDirs)
+    {
+        List<String> retVal = new ArrayList<String>(_packageWhiteList.size() * origSourceDirs.size() + origSourceDirs.size());
+
+        for (String whitelisted : _packageWhiteList)
+        {
+            whitelisted = whitelisted.replaceAll("\\.", FileUtils.getFileSeparatorForRegex());
+            for (String sourceDir : origSourceDirs)
+            {
+                String newSourceDir = sourceDir + File.separator + whitelisted;
+                if ((new File(newSourceDir)).exists())
+                {
+                    retVal.add(newSourceDir);
                 }
             }
-            return retVal;
         }
-
+        return retVal;
+    }
 
     //----------------------- standard setter and getter --------------------------------------
+
     /**
      * Add a new source dir for the corresponding scripting engine
      *
@@ -169,10 +180,54 @@
      */
     public void addSourceDir(int scriptingEngine, String sourceDir)
     {
-        if(!WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().contains(sourceDir))
+        if (!WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().contains(sourceDir))
             WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().add(sourceDir);
     }
 
+    public String getSystemClasspath() {
+        return System.getProperty("java.class.path");
+    }
+    
+    public List<String> getJarPaths()
+    {
+        ServletContext context = _contextWeakReference.get();
+        Collection<String> relativePaths = _contextWeakReference.get().getResourcePaths("/WEB-INF/lib");
+        List<String> ret = new ArrayList<String>(relativePaths.size());
+        for (String jarPath : relativePaths)
+        {
+            try
+            {
+                ret.add(context.getResource(jarPath).getFile());
+            }
+            catch (MalformedURLException e)
+            {
+                e.printStackTrace();
+            }
+        }
+        return ret;
+    }
+
+    public List<String> getClassesPaths()
+    {
+        ServletContext context = _contextWeakReference.get();
+        Collection<String> relativePaths = _contextWeakReference.get().getResourcePaths(WEB_INF_CLASSES);
+        List<String> ret = new ArrayList<String>(relativePaths.size());
+        for (String jarPath : relativePaths)
+        {
+            try
+            {
+                String file = context.getResource(jarPath).getFile();
+                int pos = file.indexOf(WEB_INF_CLASSES);
+                file = file.substring(0, pos + WEB_INF_CLASSES.length());
+                ret.add(file);
+            }
+            catch (MalformedURLException e)
+            {
+                e.printStackTrace();
+            }
+        }
+        return ret;
+    }
 
     public List<String> getAdditionalClassPath()
     {
@@ -184,7 +239,8 @@
         _additionalClassPath = additionalClassPath;
     }
 
-    public void addAdditionalClassPath(String additionalClassPath) {
+    public void addAdditionalClassPath(String additionalClassPath)
+    {
         _additionalClassPath.add(additionalClassPath);
     }
 
@@ -198,7 +254,8 @@
         _packageWhiteList = packageWhiteList;
     }
 
-    public void addWhitelistPackage(String pckg) {
+    public void addWhitelistPackage(String pckg)
+    {
         _packageWhiteList.add(pckg);
     }
 
@@ -212,7 +269,8 @@
         _resourceDirs = resourceDirs;
     }
 
-    public void addResourceDir(String resourceDir) {
+    public void addResourceDir(String resourceDir)
+    {
         _resourceDirs.add(resourceDir);
     }
 
@@ -236,6 +294,5 @@
         _compileTarget = compileTarget;
     }
 
-
 }
 
diff --git a/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala b/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
index 5c31b38..61b49ab 100644
--- a/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
+++ b/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
@@ -23,7 +23,9 @@
 import org.apache.myfaces.extensions.scripting.core.api.WeavingContext
 import scala.tools.nsc.{Global, Settings}
 import scala.collection.JavaConversions._
+
 import org.apache.myfaces.extensions.scripting.core.common.util.{ClassUtils, FileUtils}
+import java.util.Collections
 
 /**
  *
@@ -78,18 +80,15 @@
     settings.outdir.value = configuration.getCompileTarget.getAbsolutePath
     settings.deprecation.value = true // enable detailed deprecation warnings
     settings.unchecked.value = true // enable detailed unchecked warnings
-    var cp: String = System.getProperty("java.class.path")
-
+    var cp: String = configuration.getSystemClasspath();
 
     if(!cp.contains("scala")) { //probably a war container
-      val classesDir = ClassUtils.getContextClassLoader().getResource("./").getFile();
-
-      val libDir = classesDir+".."+File.separator+"lib"
-      cp = fetchJarPath(libDir, cp, classesDir)
+      val classesDir = asScalaBuffer[String]  (configuration.getClassesPaths())
+      val jarDirs    = asScalaBuffer[String]  (configuration.getJarPaths())
+      cp += classesDir.reduceLeft[String]((a1:String,  a2:String) => a1+File.pathSeparator+a2)
+      cp += jarDirs.reduceLeft[String]((a1:String,  a2:String) => a1+File.pathSeparator+a2)
     }
 
-
-
     settings.classpath.value = cp
     val reporter = new CompilationResultReporter(settings)
 
