diff --git a/extscript-core-root/extscript-cdi/readme.txt b/extscript-core-root/extscript-cdi/readme.txt
new file mode 100644
index 0000000..72d35d2
--- /dev/null
+++ b/extscript-core-root/extscript-cdi/readme.txt
@@ -0,0 +1,20 @@
+struberg: ThreadContextClassLoader
+[4:46pm] werpu_: mhh thats what I have been replacing weird
+[4:48pm] werpu_: ok enough for today
+[4:48pm] werpu_: i really have to debug this out on the owb side of things
+[4:48pm] werpu_: any hint which file does the bean classloading in the owb impl?
+[4:49pm] werpu_: outside of that using an owb extension to bootstrap my system worked like a charm
+[4:49pm] werpu_:
+[4:50pm] struberg: ScannerService
+[4:50pm] struberg: this is the SPI interface
+[4:50pm] struberg: check which one is used in your installation
+[4:50pm] werpu_: DefaultScannerService
+[4:50pm] werpu_: i assume
+[4:50pm] werpu_:
+[4:50pm] struberg: yup
+[4:51pm] werpu_: given that it is a standard web environment
+[4:51pm] werpu_: i will have a look
+[4:51pm] struberg: well, in WebApps there is another one
+[4:51pm] werpu_: ah
+[4:51pm] werpu_: ok
+[4:51pm] struberg: yup, needs to take WEB-INF/classes into consideration as well
\ No newline at end of file
diff --git a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/CDIThrowAwayClassloader.java b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/CDIThrowAwayClassloader.java
new file mode 100644
index 0000000..c89f080
--- /dev/null
+++ b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/CDIThrowAwayClassloader.java
@@ -0,0 +1,145 @@
+/*
+ * 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.cdi.core;
+
+import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
+import org.apache.myfaces.extensions.scripting.core.engine.ThrowAwayClassloader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          We use
+ */
+
+public class CDIThrowAwayClassloader extends ClassLoader
+{
+    ThrowAwayClassloader _delegate;
+
+    public CDIThrowAwayClassloader(ClassLoader classLoader)
+    {
+        super(classLoader);
+        _delegate = new ThrowAwayClassloader(classLoader);
+    }
+
+    public CDIThrowAwayClassloader()
+    {
+        super();
+        _delegate = new ThrowAwayClassloader();
+    }
+
+    @Override
+    public Class<?> loadClass(String className) throws ClassNotFoundException
+    {
+        return _delegate.loadClass(className);
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String name)
+    {
+        return _delegate.getResourceAsStream(name);
+    }
+
+    @Override
+    public URL getResource(String s)
+    {
+        if (s.contains("META-INF/beans.xml"))
+        {
+            //return target dir
+            try
+            {
+                return WeavingContext.getInstance().getConfiguration().getCompileTarget().toURI().toURL();
+            }
+            catch (MalformedURLException e)
+            {
+                //cannot really happen
+                e.printStackTrace();
+            }
+            return null;
+        }
+        return _delegate.getResource(s);
+    }
+
+    @Override
+    public Enumeration<URL> getResources(String s) throws IOException
+    {
+        Enumeration<URL> urls = _delegate.getResources(s);
+        if (s.contains("META-INF/beans.xml"))
+        {
+            ArrayList<URL> tmpList = Collections.list(urls);
+            tmpList.add(WeavingContext.getInstance().getConfiguration().getCompileTarget().toURI().toURL());
+            return Collections.enumeration(tmpList);
+        }
+        return urls;
+    }
+
+    public static URL getSystemResource(String s)
+    {
+        return ClassLoader.getSystemResource(s);
+    }
+
+    public static Enumeration<URL> getSystemResources(String s) throws IOException
+    {
+        return ClassLoader.getSystemResources(s);
+    }
+
+    public static InputStream getSystemResourceAsStream(String s)
+    {
+        return ClassLoader.getSystemResourceAsStream(s);
+    }
+
+    public static ClassLoader getSystemClassLoader()
+    {
+        return ClassLoader.getSystemClassLoader();
+    }
+
+
+    @Override
+    public void setDefaultAssertionStatus(boolean b)
+    {
+        _delegate.setDefaultAssertionStatus(b);
+    }
+
+    @Override
+    public void setPackageAssertionStatus(String s, boolean b)
+    {
+        _delegate.setPackageAssertionStatus(s, b);
+    }
+
+    @Override
+    public void setClassAssertionStatus(String s, boolean b)
+    {
+        _delegate.setClassAssertionStatus(s, b);
+    }
+
+    @Override
+    public void clearAssertionStatus()
+    {
+        _delegate.clearAssertionStatus();
+    }
+}
diff --git a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/ExtScriptScannerService.java b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/ExtScriptScannerService.java
new file mode 100644
index 0000000..768da39
--- /dev/null
+++ b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/core/ExtScriptScannerService.java
@@ -0,0 +1,215 @@
+/*
+ * 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.cdi.core;
+
+import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
+import org.apache.myfaces.extensions.scripting.jsf.startup.StartupServletContextPluginChainLoader;
+import org.apache.webbeans.config.OWBLogConst;
+import org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery;
+import org.apache.webbeans.corespi.scanner.AnnotationDB;
+import org.apache.webbeans.corespi.se.BeansXmlAnnotationDB;
+import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.logger.WebBeansLogger;
+import org.apache.webbeans.util.WebBeansUtil;
+import org.scannotation.WarUrlFinder;
+
+import javax.servlet.ServletContext;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Configures the web application to find beans.
+ */
+public class ExtScriptScannerService extends AbstractMetaDataDiscovery
+{
+    private final WebBeansLogger logger = WebBeansLogger.getLogger(ExtScriptScannerService.class);
+
+    private boolean configure = false;
+
+    protected ServletContext servletContext = null;
+
+    public ExtScriptScannerService()
+    {
+
+    }
+
+    public void init(Object context)
+    {
+        super.init(context);
+        this.servletContext = (ServletContext) context;
+        try
+        {
+            StartupServletContextPluginChainLoader.startup(servletContext);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+    }
+
+    protected void configure()
+    {
+        try
+        {
+            if (!configure)
+            {
+                Set<String> arcs = getArchives();
+                String[] urls = new String[arcs.size()];
+                urls = arcs.toArray(urls);
+
+                getAnnotationDB().scanArchives(urls);
+
+                configure = true;
+            }
+
+        }
+        catch (Exception e)
+        {
+            throw new WebBeansConfigurationException(logger.getTokenString(OWBLogConst.ERROR_0002), e);
+        }
+
+    }
+
+    /**
+     * @return all beans.xml paths
+     */
+    private Set<String> getArchives() throws Exception
+    {
+        Set<String> lists = createURLFromMarkerFile();
+        String warUrlPath = createURLFromWARFile();
+        String targetUrlPath = createURLFromTargetPath();
+
+        if (warUrlPath != null)
+        {
+            lists.add(warUrlPath);
+        }
+        lists.add(targetUrlPath);
+
+        return lists;
+    }
+
+    protected String createURLFromTargetPath()
+    {
+        File targetPath = WeavingContext.getInstance().getConfiguration().getCompileTarget();
+        return "file:" + targetPath.getAbsolutePath();
+    }
+
+    /* Creates URLs from the marker file */
+    protected Set<String> createURLFromMarkerFile() throws Exception
+    {
+        Set<String> listURL = new HashSet<String>();
+
+        // Root with beans.xml marker.
+        String[] urls = findBeansXmlBases("META-INF/beans.xml", WebBeansUtil.getCurrentClassLoader());
+
+        if (urls != null)
+        {
+            String addPath;
+            for (String url : urls)
+            {
+                String fileDir = new URL(url).getFile();
+                if (fileDir.endsWith(".jar!/"))
+                {
+                    fileDir = fileDir.substring(0, fileDir.lastIndexOf("/")) + "/META-INF/beans.xml";
+
+                    //fix for weblogic
+                    if (!fileDir.startsWith("file:/"))
+                    {
+                        fileDir = "file:/" + fileDir;
+                        //TODO switch to a more stable approach
+                        //url = new URL("jar:" + fileDir);
+                    }
+
+                    if (logger.wblWillLogDebug())
+                    {
+                        logger.debug("OpenWebBeans found the following url while doing web scanning: " + fileDir);
+                    }
+
+                    addPath = "jar:" + fileDir;
+
+                    if (logger.wblWillLogDebug())
+                    {
+                        logger.debug("OpenWebBeans added the following jar based path while doing web scanning: " +
+                                addPath);
+                    }
+                } else
+                {
+                    //X TODO check!
+                    addPath = "file:" + url + "META-INF/beans.xml";
+
+                    if (logger.wblWillLogDebug())
+                    {
+                        logger.debug("OpenWebBeans added the following file based path while doing web scanning: " +
+                                addPath);
+                    }
+
+                }
+
+                listURL.add(url);
+            }
+        }
+
+        return listURL;
+    }
+
+    /**
+     * Returns the web application class path if it contains
+     * a beans.xml marker file.
+     *
+     * @return the web application class path
+     * @throws Exception if any exception occurs
+     */
+    protected String createURLFromWARFile() throws Exception
+    {
+        if (servletContext == null)
+        {
+            // this may happen if we are running in a test container, in IDE development, etc
+            return null;
+        }
+
+        URL url = servletContext.getResource("/WEB-INF/beans.xml");
+
+        if (url != null)
+        {
+            addWebBeansXmlLocation(url);
+            URL resourceUrl = WarUrlFinder.findWebInfClassesPath(this.servletContext);
+
+            if (resourceUrl == null)
+            {
+                return null;
+            }
+
+            //set resource to beans.xml mapping
+            AnnotationDB annotationDB = getAnnotationDB();
+
+            if (annotationDB instanceof BeansXmlAnnotationDB)
+            {
+                ((BeansXmlAnnotationDB) annotationDB).setResourceBeansXml(resourceUrl.toExternalForm(), url.toExternalForm());
+            }
+            return resourceUrl.toExternalForm();
+        }
+
+        return null;
+    }
+
+}
diff --git a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/CDIServletContainerInitializer.java b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/CDIServletContainerInitializer.java
deleted file mode 100644
index 1badd95..0000000
--- a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/CDIServletContainerInitializer.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.cdi.startup;
-
-import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletContext;
-import java.lang.ref.WeakReference;
-import java.util.Set;
-
-/**
- * @author Werner Punz (latest modification by $Author$)
- * @version $Revision$ $Date$
- *
- * Initializer which stores the servlet context
- * for later non servlet based references.
- *
- * This is the first stage in the servlet lifecycle
- * and starts before the cdi container.
- *
- * Stage 0 of our startup cycle
- */
-
-public class CDIServletContainerInitializer implements ServletContainerInitializer
-{
-    private static WeakReference<ServletContext> _contextHolder = null;
-
-    public void onStartup(Set<Class<?>> c, ServletContext cx)
-    {
-        _contextHolder = new WeakReference(cx);
-    }
-
-    public static ServletContext getContext()
-    {
-        return _contextHolder.get();
-    }
-
-}
diff --git a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/StartupExtension.java b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/StartupExtension.java
index 8e1a0df..814e2f5 100644
--- a/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/StartupExtension.java
+++ b/extscript-core-root/extscript-cdi/src/main/java/org/apache/myfaces/extensions/scripting/cdi/startup/StartupExtension.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.extensions.scripting.cdi.startup;
 
+import org.apache.myfaces.extensions.scripting.cdi.core.CDIThrowAwayClassloader;
 import org.apache.myfaces.extensions.scripting.core.engine.ThrowAwayClassloader;
 import org.apache.myfaces.extensions.scripting.jsf.startup.StartupServletContextPluginChainLoader;
 
@@ -50,16 +51,8 @@
         //the compile runs but not with the daemon thread
         //after that we can load the classes
         //by temporarily plugging in our throw away classloader
-        try
-        {
-            StartupServletContextPluginChainLoader.startup(CDIServletContainerInitializer.getContext());
-            _classLoaderHolder.set(Thread.currentThread().getContextClassLoader());
-            Thread.currentThread().setContextClassLoader(new ThrowAwayClassloader());
-        }
-        catch (IOException e)
-        {
-            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
-        }
+       _classLoaderHolder.set(Thread.currentThread().getContextClassLoader());
+       Thread.currentThread().setContextClassLoader(new CDIThrowAwayClassloader(Thread.currentThread().getContextClassLoader()));
     }
 
     void afterBeanDiscovery(@Observes AfterBeanDiscovery abd)
diff --git a/extscript-core-root/extscript-cdi/src/main/resources/META-INF/openwebbeans/openwebbeans.properties b/extscript-core-root/extscript-cdi/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
new file mode 100644
index 0000000..2f8c29c
--- /dev/null
+++ b/extscript-core-root/extscript-cdi/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
@@ -0,0 +1,6 @@
+configuration.ordinal=12
+
+################################### WEB Scanner Service ####################################
+#Default implementation of org.apache.webbeans.corespi.ScannerService.
+org.apache.webbeans.spi.ScannerService=org.apache.myfaces.extensions.scripting.cdi.core.ExtScriptScannerService
+################################################################################################
\ No newline at end of file
diff --git a/extscript-core-root/extscript-cdi/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/extscript-core-root/extscript-cdi/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
deleted file mode 100644
index 0ddf67b..0000000
--- a/extscript-core-root/extscript-cdi/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
+++ /dev/null
@@ -1,20 +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.
-#####################################################################################
-
-org.apache.myfaces.extensions.scripting.cdi.startup.CDIServletContainerInitializer
\ No newline at end of file
