Switch to apache-jsp for jetty-osgi
diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml
index 7153ed9..34d3b95 100644
--- a/apache-jsp/pom.xml
+++ b/apache-jsp/pom.xml
@@ -26,6 +26,7 @@
             </goals>
             <configuration>
               <instructions>
+                <Bundle-Description>Jetty-specific ServletContainerInitializer for Jasper</Bundle-Description>
                 <Export-Package>org.eclipse.jetty.apache.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
                 <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
                 <Provide-Capability>osgi.serviceloader; osgi.serviceloader=javax.servlet.ServletContainerInitializer</Provide-Capability>
@@ -37,6 +38,29 @@
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>artifact-jar</id>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>test-jar</id>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
         <executions>
           <execution>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index 2a36eb3..54374e6 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
@@ -39,10 +39,31 @@
     <!-- Orbit JSP Deps -->
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-jsp</artifactId>
+      <artifactId>apache-jsp</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.orbit</groupId>
+      <artifactId>javax.servlet.jsp.jstl</artifactId>
+    </dependency>
+   <dependency>
+       <groupId>org.glassfish.web</groupId>
+       <artifactId>javax.servlet.jsp.jstl</artifactId>
+    </dependency>
+   <dependency>
+       <groupId>org.mortbay.jasper</groupId>
+       <artifactId>apache-el</artifactId>
+       <version>8.0.9-SNAPSHOT</version>
+    </dependency>
   </dependencies>
+<!--
+   <dependency>
+       <groupId>javax.el</groupId>
+       <artifactId>javax.el-api</artifactId>
+       <version>3.0.0</version>
+    </dependency>
+  </dependencies>
+-->
 
   <build>
     <plugins>
@@ -96,7 +117,7 @@
  javax.el;version="[3.0,3.1)",
  javax.servlet;version="[3.1,3.2)",
  javax.servlet.resources;version="[3.1,3.2)",
- javax.servlet.jsp.resources;version="[3.1,3.2)",
+ javax.servlet.jsp.resources;version="[2.3,4)",
  javax.servlet.jsp;version="[2.3,2.4)",
  javax.servlet.jsp.el;version="[2.3,2.4)",
  javax.servlet.jsp.tagext;version="[2.3,2.4)",
@@ -104,16 +125,20 @@
  javax.servlet.jsp.jstl.fmt;version="1.2";resolution:=optional,
  javax.servlet.jsp.jstl.sql;version="1.2";resolution:=optional,
  javax.servlet.jsp.jstl.tlv;version="1.2";resolution:=optional,
- org.apache.jasper;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.compiler;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.compiler.tagplugin;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.runtime;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.security;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.servlet;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.tagplugins.jstl;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.util;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.xmlparser;version="[2.3.2,2.4)";resolution:=optional,
- org.glassfish.jsp.api;version="[2.3.2,2.4)";resolution:=optional,
+ org.apache.el;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.lang;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.stream;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.util;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.parser;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.compiler;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.compiler.tagplugin;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.runtime;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.security;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.servlet;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.tagplugins.jstl;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.util;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.xmlparser;version="[8.0.9,9)";resolution:=optional,
  org.apache.taglibs.standard;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.extra.spath;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.functions;version="1.2";resolution:=optional,
@@ -137,6 +162,7 @@
  org.apache.taglibs.standard.tag.rt.xml;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.tei;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.tlv;version="1.2";resolution:=optional,
+ org.apache.tomcat;version="[8.0.9,9)";resolution:=optional,
  org.osgi.*,
  org.xml.*;resolution:=optional,
  org.xml.sax.*;resolution:=optional,
@@ -145,8 +171,8 @@
  org.w3c.dom.ls;resolution:=optional,
  javax.xml.parser;resolution:=optional
  </Import-Package>
-                <_nouses>true</_nouses>
-                <DynamicImport-Package>org.apache.jasper.*;version="2.3"</DynamicImport-Package>
+               <_nouses>true</_nouses>
+               <DynamicImport-Package>org.apache.jasper.*;version="8.0.9",org.apache.el.*;version="8.0.9"</DynamicImport-Package>
               </instructions>
           </configuration>
       </plugin>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
index b88fda6..7979d7b 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
@@ -27,10 +27,15 @@
 import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
+import javax.servlet.jsp.JspFactory;
+
 import org.eclipse.jetty.deploy.DeploymentManager;
+import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
 import org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
 import org.eclipse.jetty.osgi.boot.utils.TldBundleDiscoverer;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.FrameworkUtil;
 
@@ -39,15 +44,24 @@
 /**
  * ContainerTldBundleDiscoverer
  * 
+ * Finds bundles that are considered as on the container classpath that
+ * contain tlds.
  * 
- * Use a System property to define bundles that contain tlds that need to
- * be treated by jasper as if they were on the jetty container's classpath.
+ * The System property org.eclipse.jetty.osgi.tldbundles is a comma
+ * separated list of exact symbolic names of bundles that have container classpath
+ * tlds.
  * 
- * The value of the property is evaluated against the DeploymentManager 
- * context attribute "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern", 
- * which defines a pattern of matching bundle names.
+ * The DeploymentManager context attribute "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern"
+ * can be used to define a pattern of symbolic names of bundles that contain container 
+ * classpath tlds.
  * 
- * The bundle locations are converted to URLs for jasper's use.
+ * The matching bundles are converted to URLs that are put onto a special classloader that acts as the
+ * parent classloader for contexts deployed by the jetty Server instance (see ServerInstanceWrapper).
+ * 
+ * It also discovers the bundle that contains the jstl taglib and adds it into the 
+ * "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern" (if it is not already there) so
+ * that the WebInfOSGiConfiguration class will add the jstl taglib bundle into the list of container
+ * resources.
  * 
  * Eg:
  * -Dorg.eclipse.jetty.osgi.tldbundles=org.springframework.web.servlet,com.opensymphony.module.sitemesh
@@ -55,16 +69,20 @@
  */
 public class ContainerTldBundleDiscoverer implements TldBundleDiscoverer
 {
+
+    private static final Logger LOG = Log.getLogger(ContainerTldBundleDiscoverer.class);
+    
+
+    private static String DEFAULT_JSP_FACTORY_IMPL_CLASS = "org.apache.jasper.runtime.JspFactoryImpl";
     /**
-     * Comma separated list of names of bundles that contain tld files that should be
-     * discoved by jasper as if they were on the container's classpath.
-     * Eg:
-     * -Djetty.osgi.tldbundles=org.springframework.web.servlet,com.opensymphony.module.sitemesh
+     * Default name of a class that belongs to the jstl bundle. From that class
+     * we locate the corresponding bundle and register it as a bundle that
+     * contains tld files.
      */
-    public static final String SYS_PROP_TLD_BUNDLES = "org.eclipse.jetty.osgi.tldbundles";
+    private static String DEFAULT_JSTL_BUNDLE_CLASS = "org.apache.taglibs.standard.tag.el.core.WhenTag";
 
-
-
+    private Bundle jstlBundle = null;
+    
     /**
      * Check the System property "org.eclipse.jetty.osgi.tldbundles" for names of
      * bundles that contain tlds and convert to URLs.
@@ -72,19 +90,18 @@
      * @return The location of the jars that contain tld files as URLs.
      */
     public URL[] getUrlsForBundlesWithTlds(DeploymentManager deploymentManager, BundleFileLocatorHelper locatorHelper) throws Exception
-    {
-        // naive way of finding those bundles.
-        // lots of assumptions: for example we assume a single version of each
-        // bundle that would contain tld files.
-        // this is probably good enough as those tlds are loaded system-wide on
-        // jetty.
-        // to do better than this we need to do it on a per webapp basis.
-        // probably using custom properties in the ContextHandler service
-        // and mirroring those in the MANIFEST.MF
+    {        
+        if (!isJspAvailable())
+        {
+            return new URL[0];
+        }
+
+        if (jstlBundle == null)
+            jstlBundle = findJstlBundle();
 
         Bundle[] bundles = FrameworkUtil.getBundle(ContainerTldBundleDiscoverer.class).getBundleContext().getBundles();
         HashSet<URL> urls = new HashSet<URL>();
-        String tmp = System.getProperty(SYS_PROP_TLD_BUNDLES); //comma separated exact names
+        String tmp = System.getProperty(OSGiWebInfConfiguration.SYS_PROP_TLD_BUNDLES); //comma separated exact names
         List<String> sysNames =   new ArrayList<String>();
         if (tmp != null)
         {
@@ -93,13 +110,33 @@
                 sysNames.add(tokenizer.nextToken());
         }
         tmp = (String) deploymentManager.getContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN); //bundle name patterns
+    
         Pattern pattern = (tmp==null? null : Pattern.compile(tmp));
+        
+        //check that the jstl bundle is not already included in the pattern, and include it if it is not because
+        //subsequent classes such as OSGiWebInfConfiguration use this pattern to determine which jars are
+        //considered to be on the container classpath
+        if (jstlBundle != null) 
+        {
+            if (pattern == null)
+            {
+                pattern = Pattern.compile(jstlBundle.getSymbolicName());
+                deploymentManager.setContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN, jstlBundle.getSymbolicName());
+            }
+            else if (!(pattern.matcher(jstlBundle.getSymbolicName()).matches()))
+            {
+                String s = tmp+"|"+jstlBundle.getSymbolicName();
+                pattern = Pattern.compile(s);
+                deploymentManager.setContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN, s);
+            }
+        }
+
+        
         for (Bundle bundle : bundles)
         {
             if (sysNames.contains(bundle.getSymbolicName()))
-                convertBundleLocationToURL(locatorHelper, bundle, urls);
-           
-            if (pattern != null && pattern.matcher(bundle.getSymbolicName()).matches())
+                convertBundleLocationToURL(locatorHelper, bundle, urls);           
+            else if (pattern != null && pattern.matcher(bundle.getSymbolicName()).matches())
                 convertBundleLocationToURL(locatorHelper, bundle, urls);
         }
 
@@ -108,6 +145,79 @@
     }
 
     /**
+     * Check that jsp is on the classpath
+     * @return
+     */
+    public boolean isJspAvailable()
+    {
+        try
+        {
+            getClass().getClassLoader().loadClass("org.apache.jasper.servlet.JspServlet");
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to locate the JspServlet: jsp support unavailable.", e);
+            return false;
+        }
+        return true;
+    }
+    
+    
+    /**
+     * 
+     * Some versions of JspFactory do Class.forName, which probably won't work in an 
+     * OSGi environment.
+     */
+    public void fixJspFactory ()
+    {   
+        try
+        {
+            Class<javax.servlet.ServletContext> servletContextClass = javax.servlet.ServletContext.class;
+            // bug #299733
+            JspFactory fact = JspFactory.getDefaultFactory();
+            if (fact == null)
+            { // bug #299733
+              // JspFactory does a simple
+              // Class.getForName("org.apache.jasper.runtime.JspFactoryImpl")
+              // however its bundles does not import the jasper package
+              // so it fails. let's help things out:
+                fact = (JspFactory) JettyBootstrapActivator.class.getClassLoader().loadClass(DEFAULT_JSP_FACTORY_IMPL_CLASS).newInstance();
+                JspFactory.setDefaultFactory(fact);
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to set the JspFactory: jsp support incomplete.", e);
+        }
+    }
+    
+    
+    /**
+     * Find the bundle that contains a jstl implementation class, which assumes that
+     * the jstl taglibs will be inside the same bundle.
+     * @return
+     */
+    public Bundle findJstlBundle ()
+    {
+        Class<?> jstlClass = null;
+    
+        try
+        {
+            jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
+        }
+        catch (ClassNotFoundException e)
+        {
+            LOG.info("jstl not on classpath", e);
+        }
+        
+        if (jstlClass != null)
+            //get the bundle containing jstl
+            return FrameworkUtil.getBundle(jstlClass);
+        
+        return null;
+    }
+    
+    /**
      * Resolves a bundle that contains tld files as a URL. The URLs are
      * used by jasper to discover the tld files.
      * 
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
index 04cdc72..3857664 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
@@ -20,9 +20,11 @@
 
 import java.io.File;
 import java.io.InputStream;
+import java.lang.reflect.Field;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Set;
 
 import javax.servlet.Servlet;
 import javax.servlet.jsp.JspContext;
@@ -30,7 +32,6 @@
 
 import org.apache.jasper.Constants;
 import org.apache.jasper.compiler.Localizer;
-import org.apache.jasper.xmlparser.ParserUtils;
 import org.eclipse.jetty.deploy.DeploymentManager;
 import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
@@ -85,10 +86,12 @@
      * implementation. bug #299733
      */
     private static String DEFAULT_JSP_FACTORY_IMPL_CLASS = "org.apache.jasper.runtime.JspFactoryImpl";
+    
+    private static final Set<URL> __tldBundleCache = new HashSet<URL>();
 
     public JSTLBundleDiscoverer()
     {
-        fixupDtdResolution();
+        //fixupDtdResolution();
 
         try
         {
@@ -102,6 +105,7 @@
         }
         try
         {
+            Class<javax.servlet.ServletContext> servletContextClass = javax.servlet.ServletContext.class;
             // bug #299733
             JspFactory fact = JspFactory.getDefaultFactory();
             if (fact == null)
@@ -143,7 +147,7 @@
     {
 
         ArrayList<URL> urls = new ArrayList<URL>();
-        HashSet<Class<?>> classesToAddToTheTldBundles = new HashSet<Class<?>>();
+        Class<?> jstlClass = null;
 
         // Look for the jstl bundle
         // We assume the jstl's tlds are defined there.
@@ -151,18 +155,21 @@
         // So we can look for this class using this bundle's classloader:
         try
         {
-            Class<?> jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
-
-            classesToAddToTheTldBundles.add(jstlClass);
+            jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
         }
         catch (ClassNotFoundException e)
         {
             LOG.info("jstl not on classpath", e);
         }
-        for (Class<?> cl : classesToAddToTheTldBundles)
+        
+        if (jstlClass != null)
         {
-            Bundle tldBundle = FrameworkUtil.getBundle(cl);
+            //get the bundle containing jstl
+            Bundle tldBundle = FrameworkUtil.getBundle(jstlClass);
             File tldBundleLocation = locatorHelper.getBundleInstallLocation(tldBundle);
+            
+            System.err.println("jstl bundle: "+tldBundle);
+            System.err.println("jstl bundle location: "+tldBundleLocation);
             if (tldBundleLocation != null && tldBundleLocation.isDirectory())
             {
                 // try to find the jar files inside this folder
@@ -170,6 +177,7 @@
                 {
                     if (f.getName().endsWith(".jar") && f.isFile())
                     {
+                        System.err.println("Tld jar in dir: "+f.toURI());
                         urls.add(f.toURI().toURL());
                     }
                     else if (f.isDirectory() && f.getName().equals("lib"))
@@ -178,6 +186,7 @@
                         {
                             if (f2.getName().endsWith(".jar") && f2.isFile())
                             {
+                                System.err.println("Tld jar in lib dir: "+f2.toURI());
                                 urls.add(f2.toURI().toURL());
                             }
                         }
@@ -187,9 +196,20 @@
             }
             else if (tldBundleLocation != null)
             {
+                System.err.println("Tld bundle uri: "+tldBundleLocation.toURI());
                 urls.add(tldBundleLocation.toURI().toURL());
+              
+                String pattern = (String)deployer.getContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern");
+                pattern = (pattern==null?"":pattern);
+                if (!pattern.contains(tldBundle.getSymbolicName()))
+                {
+                    pattern += "|"+tldBundle.getSymbolicName();
+                    deployer.setContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern", pattern);
+                }
+                System.err.println("PATTERN: "+pattern);
             }
         }
+        
         return urls.toArray(new URL[urls.size()]);
     }
 
@@ -209,11 +229,12 @@
      * new value on a static friendly field :(
      * </p>
      */
-    void fixupDtdResolution()
+   void fixupDtdResolution()
     {
         try
         {
-            ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
+           // ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
+         
 
         }
         catch (Exception e)
@@ -227,21 +248,21 @@
      * Instead of using the ParserUtil's classloader, we use a class that is
      * indeed next to the resource for sure.
      */
-    static class MyFixedupEntityResolver implements EntityResolver
-    {
+    //static class MyFixedupEntityResolver implements EntityResolver
+    //{
         /**
          * Same values than in ParserUtils...
          */
-        static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
+      /*  static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
                                                        Constants.WEBAPP_DTD_PUBLIC_ID_22, Constants.WEBAPP_DTD_PUBLIC_ID_23, };
 
         static final String[] CACHED_DTD_RESOURCE_PATHS = { Constants.TAGLIB_DTD_RESOURCE_PATH_11, Constants.TAGLIB_DTD_RESOURCE_PATH_12,
                                                            Constants.WEBAPP_DTD_RESOURCE_PATH_22, Constants.WEBAPP_DTD_RESOURCE_PATH_23, };
 
         static final String[] CACHED_SCHEMA_RESOURCE_PATHS = { Constants.TAGLIB_SCHEMA_RESOURCE_PATH_20, Constants.TAGLIB_SCHEMA_RESOURCE_PATH_21,
-                                                              Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, };
+                                                              Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, };*/
 
-        public InputSource resolveEntity(String publicId, String systemId) throws SAXException
+      /*  public InputSource resolveEntity(String publicId, String systemId) throws SAXException
         {
             for (int i = 0; i < CACHED_DTD_PUBLIC_IDS.length; i++)
             {
@@ -255,11 +276,11 @@
                     {
                         input = JspContext.class.getResourceAsStream(resourcePath);
                         if (input == null)
-                        {
+                        {*/
                             // if that failed try again with the original code:
                             // although it is likely not changed.
-                            input = this.getClass().getResourceAsStream(resourcePath);
-                        }
+                   /*         input = this.getClass().getResourceAsStream(resourcePath);
+                      }
                     }
                     if (input == null) { throw new SAXException(Localizer.getMessage("jsp.error.internal.filenotfound", resourcePath)); }
                     InputSource isrc = new InputSource(input);
@@ -269,6 +290,6 @@
 
             return null;
         }
-    }
+    }*/
 
 }
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
index d9bd9b6..7417580 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
@@ -18,17 +18,16 @@
 
 package org.eclipse.jetty.osgi.boot.jsp;
 
-import org.eclipse.jetty.osgi.boot.BundleWebAppProvider;
+
 import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
 import org.eclipse.jetty.osgi.boot.jasper.ContainerTldBundleDiscoverer;
-import org.eclipse.jetty.osgi.boot.jasper.JSTLBundleDiscoverer;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
 /**
  * FragmentActivator
  * 
- * Sets up support for jsp. All relevant jsp jars must also be installed
+ * Sets up support for jsp and jstl. All relevant jsp jars must also be installed
  * into the osgi environment.
  *  <p>
  * Note that as this is part of a bundle fragment, this activator is NOT
@@ -54,7 +53,6 @@
         //set up some classes that will look for bundles with tlds that must be converted
         //to urls and treated as if they are on the Jetty container's classpath so that 
         //jasper can deal with them
-        ServerInstanceWrapper.addContainerTldBundleDiscoverer(new JSTLBundleDiscoverer());
         ServerInstanceWrapper.addContainerTldBundleDiscoverer(new ContainerTldBundleDiscoverer());      
     }
 
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
index 14c796d..7ceca89 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
@@ -67,6 +67,10 @@
     }
     
     
+    public AnnotationConfiguration()
+    {
+        System.err.println("Constructed osgi.AnnotationConfiguration");
+    }
     /**
      * This parser scans the bundles using the OSGi APIs instead of assuming a jar.
      */
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
index 6d31ebd..97f9296 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
@@ -268,6 +268,7 @@
 
             //Sets the location of the war file
             // converts bundleentry: protocol if necessary
+            System.err.println("WAR : "+BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(url).toString());
             _webApp.setWar(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(url).toString());
 
             // Set up what has been configured on the provider
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
index 69a7ce8..4482640 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
@@ -50,7 +50,14 @@
 {
     private static final Logger LOG = Log.getLogger(WebInfConfiguration.class);
     
-    
+    /**
+     * Comma separated list of symbolic names of bundles that contain tlds that should be considered
+     * as on the container classpath
+     */
+    public static final String SYS_PROP_TLD_BUNDLES = "org.eclipse.jetty.osgi.tldbundles";
+    /**
+     * Regex of symbolic names of bundles that should be considered to be on the container classpath
+     */
     public static final String CONTAINER_BUNDLE_PATTERN = "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern";
     public static final String FRAGMENT_AND_REQUIRED_BUNDLES = "org.eclipse.jetty.osgi.fragmentAndRequiredBundles";
     public static final String FRAGMENT_AND_REQUIRED_RESOURCES = "org.eclipse.jetty.osgi.fragmentAndRequiredResources";
@@ -84,7 +91,7 @@
         String tmp = (String)context.getAttribute(CONTAINER_BUNDLE_PATTERN);
         Pattern pattern = (tmp==null?null:Pattern.compile(tmp));
         List<String> names = new ArrayList<String>();
-        tmp = System.getProperty("org.eclipse.jetty.osgi.tldbundles");
+        tmp = System.getProperty(SYS_PROP_TLD_BUNDLES);
         if (tmp != null)
         {
             StringTokenizer tokenizer = new StringTokenizer(tmp, ", \n\r\t", false);
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
index 94a06f6..bdd52ac 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
@@ -97,6 +97,13 @@
     
     
     
+    @Override
+    public Class<?> loadClass(String name) throws ClassNotFoundException
+    {
+        System.err.println("LOADING  CLASS: "+name);
+        return super.loadClass(name);
+    }
+
     /* ------------------------------------------------------------ */
     /**
      * Returns the <code>Bundle</code> that defined this web-application.
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index 6b54547..2a734b9 100644
--- a/jetty-osgi/test-jetty-osgi/pom.xml
+++ b/jetty-osgi/test-jetty-osgi/pom.xml
@@ -130,12 +130,7 @@
         </exclusion>
       </exclusions>
     </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-jsp-fragment</artifactId>
-      <version>2.3.3</version>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>org.eclipse.jetty.osgi</groupId>
       <artifactId>jetty-httpservice</artifactId>
@@ -144,10 +139,11 @@
     </dependency>
 
     <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <scope>test</scope>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-osgi-servlet-api</artifactId>
+      <version>3.1-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jta_1.1_spec</artifactId>
@@ -168,6 +164,12 @@
      <scope>test</scope>
     </dependency>
 
+    <dependency>
+     <groupId>org.mortbay.jasper</groupId>
+      <artifactId>apache-el</artifactId>
+      <version>8.0.9-SNAPSHOT</version>
+     <scope>test</scope>
+    </dependency>
 
 
     <!-- Jetty Deps -->
@@ -341,6 +343,15 @@
       <classifier>webbundle</classifier>
       <scope>test</scope>
     </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty.tests</groupId>
+      <artifactId>test-spec-webapp</artifactId>
+      <version>${project.version}</version>
+      <type>war</type>
+      <scope>test</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.eclipse.jetty.osgi</groupId>
       <artifactId>test-jetty-osgi-context</artifactId>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
index 2565c5b..b5035fa 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
@@ -88,13 +88,10 @@
         res.add(mavenBundle().groupId( "org.apache.aries" ).artifactId( "org.apache.aries.util" ).versionAsInProject().start());
         res.add(mavenBundle().groupId( "org.apache.aries.spifly" ).artifactId( "org.apache.aries.spifly.dynamic.bundle" ).versionAsInProject().start());
 
-        res.add(mavenBundle().groupId( "javax.servlet" ).artifactId( "javax.servlet-api" ).versionAsInProject().noStart());
+        res.add(mavenBundle().groupId( "org.eclipse.jetty.toolchain" ).artifactId( "jetty-osgi-servlet-api" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "javax.annotation" ).artifactId( "javax.annotation-api" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.apache.geronimo.specs" ).artifactId( "geronimo-jta_1.1_spec" ).version("1.1.1").noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty.orbit" ).artifactId( "javax.mail.glassfish" ).version( "1.4.1.v201005082020" ).noStart());
-        
-     
-        res.add(mavenBundle().groupId( "org.eclipse.jetty.toolchain" ).artifactId( "jetty-schemas" ).versionAsInProject().noStart());
 
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-deploy" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-server" ).versionAsInProject().noStart());  
@@ -122,6 +119,32 @@
         res.add(mavenBundle().groupId( "org.eclipse.jetty.osgi" ).artifactId( "jetty-osgi-boot" ).versionAsInProject().start());
         return res;
     }
+    
+    public static List<Option> consoleDependencies()
+    {
+        List<Option> res = new ArrayList<Option>();
+        res.add(systemProperty("osgi.console").value("6666"));
+        res.add(systemProperty("osgi.console.enable.builtin").value("true")); 
+        return res;
+    }
+    
+    
+    
+    public static List<Option> jspDependencies()
+    {
+        List<Option> res = new ArrayList<Option>();
+  
+        //jetty jsp bundles  
+        res.add(mavenBundle().groupId("org.eclipse.jetty.toolchain").artifactId("jetty-schemas").versionAsInProject());
+        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
+        res.add(mavenBundle().groupId("org.mortbay.jasper").artifactId("apache-el").versionAsInProject());
+        res.add(mavenBundle().groupId("org.mortbay.jasper").artifactId("apache-jsp").versionAsInProject());
+        res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("apache-jsp").versionAsInProject());
+        res.add(mavenBundle().groupId("org.glassfish.web").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
+        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("org.eclipse.jdt.core").versionAsInProject());
+        res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-boot-jsp").versionAsInProject().noStart());
+        return res;
+    }
      
     public static List<Option> httpServiceJetty()
     {
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
index cf2e30f..1119446 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
@@ -110,15 +110,8 @@
     public static List<Option> jspDependencies()
     {
         List<Option> res = new ArrayList<Option>();
-        
-        //jsp bundles
-        res.add(mavenBundle().groupId("javax.servlet.jsp").artifactId("javax.servlet.jsp-api").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
-        res.add(mavenBundle().groupId("org.glassfish.web").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
-        res.add(mavenBundle().groupId("org.glassfish").artifactId("javax.el").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("org.eclipse.jdt.core").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.toolchain").artifactId("jetty-jsp-fragment").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-boot-jsp").versionAsInProject().noStart());
+
+        res.addAll(TestJettyOSGiBootCore.jspDependencies());
 
         // a bundle that registers a webapp as a service for the jetty osgi core
         // to pick up and deploy
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java
new file mode 100644
index 0000000..e1bdd8b
--- /dev/null
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java
@@ -0,0 +1,179 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.osgi.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.osgi.boot.OSGiServerConstants;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Pax-Exam to make sure the jetty-osgi-boot can be started along with the
+ * httpservice web-bundle. Then make sure we can deploy an OSGi service on the
+ * top of this.
+ */
+@RunWith(PaxExam.class)
+@Ignore
+public class TestJettyOSGiBootWithAnnotations
+{
+    private static final String LOG_LEVEL = "WARN";
+
+    @Inject
+    BundleContext bundleContext = null;
+
+    @Configuration
+    public static Option[] configure()
+    {
+
+        ArrayList<Option> options = new ArrayList<Option>();
+        options.add(CoreOptions.junitBundles());
+        options.addAll(configureJettyHomeAndPort("jetty-selector.xml"));
+        options.add(CoreOptions.bootDelegationPackages("org.xml.sax", "org.xml.*", "org.w3c.*", "javax.xml.*", "javax.activation.*"));
+        options.add(CoreOptions.systemPackages("com.sun.org.apache.xalan.internal.res","com.sun.org.apache.xml.internal.utils",
+                                               "com.sun.org.apache.xml.internal.utils", "com.sun.org.apache.xpath.internal",
+                                               "com.sun.org.apache.xpath.internal.jaxp", "com.sun.org.apache.xpath.internal.objects"));
+     
+        options.addAll(TestJettyOSGiBootCore.coreJettyDependencies());
+        options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
+        options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
+        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.LEVEL").value(LOG_LEVEL))));
+        //options.addAll(TestJettyOSGiBootCore.consoleDependencies());
+        options.addAll(jspDependencies());
+       
+        return options.toArray(new Option[options.size()]);
+    }
+
+    public static List<Option> configureJettyHomeAndPort(String jettySelectorFileName)
+    {
+        File etcFolder = new File("src/test/config/etc");
+        String etc = "file://" + etcFolder.getAbsolutePath();
+        List<Option> options = new ArrayList<Option>();
+        String xmlConfigs = etc     + "/jetty.xml;"
+                + etc
+                + "/"
+                + jettySelectorFileName
+                + ";"
+                + etc
+                + "/jetty-ssl.xml;"
+                + etc
+                + "/jetty-https.xml;"
+                + etc
+                + "/jetty-deployer.xml;"
+                + etc
+                + "/jetty-testrealm.xml";
+
+        options.add(systemProperty(OSGiServerConstants.MANAGED_JETTY_XML_CONFIG_URLS).value(xmlConfigs));
+        options.add(systemProperty("jetty.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT)));
+        options.add(systemProperty("jetty.home").value(etcFolder.getParentFile().getAbsolutePath()));
+        return options;
+    }
+
+    public static List<Option> jspDependencies()
+    {
+        List<Option> res = new ArrayList<Option>();
+        res.addAll(TestJettyOSGiBootCore.jspDependencies());
+
+        //test webapp bundle
+        res.add(mavenBundle().groupId("org.eclipse.jetty.tests").artifactId("test-spec-webapp").classifier("webbundle").versionAsInProject());
+
+        return res;
+    }
+
+    
+
+    @Ignore
+    @Test
+    public void assertAllBundlesActiveOrResolved()
+    {
+        TestOSGiUtil.assertAllBundlesActiveOrResolved(bundleContext);
+    }
+
+    // at the moment can't run httpservice with jsp at the same time.
+    // that is a regression in jetty-9
+    @Ignore
+    @Test
+    public void testHttpService() throws Exception
+    {
+        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT);
+    }
+
+ 
+    @Ignore
+    @Test
+    public void testJspDump() throws Exception
+    {
+        HttpClient client = new HttpClient();
+        try
+        {
+            client.start();
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/jsp/dump.jsp");
+            assertEquals(HttpStatus.OK_200, response.getStatus());
+
+            String content = new String(response.getContent());
+            assertTrue(content.contains("<tr><th>ServletPath:</th><td>/jsp/dump.jsp</td></tr>"));
+           
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+
+    @Test
+    public void testIndex() throws Exception
+    {        
+        HttpClient client = new HttpClient();
+        try
+        {
+            client.start();
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/index.html");
+            //assertEquals(HttpStatus.OK_200, response.getStatus());
+
+            String content = new String(response.getContent());
+            System.err.println(content);
+           
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+
+}
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
index b2a9be5..305fe9a 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
@@ -52,7 +52,7 @@
 @RunWith(PaxExam.class)
 public class TestJettyOSGiBootWithJsp
 {
-    private static final String LOG_LEVEL = "WARN";
+    private static final String LOG_LEVEL = "INFO";
 
     @Inject
     BundleContext bundleContext = null;
@@ -73,7 +73,7 @@
         options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
         options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
         options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.LEVEL").value(LOG_LEVEL))));
-
+        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.annotations.LEVEL").value("DEBUG"))));
         options.addAll(jspDependencies());
         return options.toArray(new Option[options.size()]);
     }
@@ -106,26 +106,19 @@
     public static List<Option> jspDependencies()
     {
         List<Option> res = new ArrayList<Option>();
-  
-        //jetty jsp bundles
-        res.add(mavenBundle().groupId("javax.servlet.jsp").artifactId("javax.servlet.jsp-api").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
-        res.add(mavenBundle().groupId("org.glassfish.web").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
-        res.add(mavenBundle().groupId("org.glassfish").artifactId("javax.el").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("org.eclipse.jdt.core").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.toolchain").artifactId("jetty-jsp-fragment").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-boot-jsp").versionAsInProject().noStart());
-      
+        res.addAll(TestJettyOSGiBootCore.jspDependencies());
         //test webapp bundle
         res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("test-jetty-webapp").classifier("webbundle").versionAsInProject());
-
+        
         return res;
     }
 
-    @Ignore
+
     @Test
+    @Ignore
     public void assertAllBundlesActiveOrResolved()
     {
+        TestOSGiUtil.debugBundles(bundleContext);
         TestOSGiUtil.assertAllBundlesActiveOrResolved(bundleContext);
     }
 
@@ -142,16 +135,15 @@
     @Test
     public void testJspDump() throws Exception
     {
+   
         HttpClient client = new HttpClient();
         try
         {
             client.start();
-            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/jsp/dump.jsp");
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/jsp/jstl.jsp");
             assertEquals(HttpStatus.OK_200, response.getStatus());
-
             String content = new String(response.getContent());
-            assertTrue(content.contains("<tr><th>ServletPath:</th><td>/jsp/dump.jsp</td></tr>"));
-           
+            assertTrue(content.contains("JSTL Example"));           
         }
         finally
         {
diff --git a/pom.xml b/pom.xml
index 73f7bf4..277a2da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -540,7 +540,7 @@
       <dependency>
         <groupId>org.mortbay.jasper</groupId>
         <artifactId>apache-jsp</artifactId>
-        <version>8.0.9.M2</version>
+        <version>8.0.9-SNAPSHOT</version>
       </dependency>
 
       <dependency>
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
index b9a3093..43e496a 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
@@ -18,6 +18,69 @@
           <skip>true</skip>
         </configuration>
       </plugin>
+       
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>src/main/assembly/config.xml</descriptor>
+                <descriptor>src/main/assembly/web-bundle.xml</descriptor>
+              </descriptors>
+              <archive>
+                <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+              </archive>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- also make this webapp an osgi bundle -->
+      <plugin>
+        <artifactId>maven-war-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <supportedProjectTypes>
+            <supportedProjectType>war</supportedProjectType>
+          </supportedProjectTypes>
+        </configuration>
+        <executions>
+          <execution>
+            <id>bundle-manifest</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+            <configuration>
+              <instructions>
+                <Bundle-SymbolicName>org.eclipse.jetty.tests.test-spec-webapp</Bundle-SymbolicName>
+                <Import-Package>javax.servlet.jsp.*;version="[2.2.0, 3.0)",javax.transaction.*;version="[1.1, 2.0)", javax.servlet.*;version="3.0",org.eclipse.jetty.*;version="9.2",*</Import-Package>
+                <Export-Package>!com.acme*</Export-Package>
+                <Web-ContextPath>/</Web-ContextPath>
+                <Bundle-ClassPath>.,WEB-INF/classes,WEB-INF/lib</Bundle-ClassPath>
+              </instructions>
+            </configuration>
+           </execution>
+        </executions>
+      </plugin>
+
+
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
@@ -65,7 +128,7 @@
           </execution>
         </executions>
        </plugin>
-       <plugin>
+       <!-- plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-assembly-plugin</artifactId>
           <version>2.2-beta-3</version>
@@ -82,7 +145,7 @@
               </configuration>
             </execution>
           </executions>
-       </plugin>
+       </plugin -->
       <plugin>
         <groupId>org.eclipse.jetty</groupId>
         <artifactId>jetty-maven-plugin</artifactId>
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/assembly/web-bundle.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/assembly/web-bundle.xml
new file mode 100644
index 0000000..2f3701a
--- /dev/null
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/assembly/web-bundle.xml
@@ -0,0 +1,18 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>webbundle</id>
+  <formats>
+    <format>jar</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <fileSets>
+    <fileSet>
+      <directory>${basedir}/${project.build.directory}/${project.build.finalName}/</directory>
+      <outputDirectory></outputDirectory>
+      <includes>
+        <include>**/*.*</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+</assembly>