diff --git a/maven-pluto-plugin/src/main/java/org/apache/pluto/maven/InstallationDependency.java b/maven-pluto-plugin/src/main/java/org/apache/pluto/maven/InstallationDependency.java
index 8aec848..1b6ea6a 100644
--- a/maven-pluto-plugin/src/main/java/org/apache/pluto/maven/InstallationDependency.java
+++ b/maven-pluto-plugin/src/main/java/org/apache/pluto/maven/InstallationDependency.java
@@ -54,6 +54,10 @@
         new InstallationDependency("org.jboss.weld.servlet", "weld-servlet", 
                 VERSION_PROPERTIES.getProperty("cdi.version"));
 
+    public static final InstallationDependency ANNOTATION_DETECTOR =
+        new InstallationDependency("eu.infomas", "annotation-detector", 
+                VERSION_PROPERTIES.getProperty("annotation-detector.version"));
+
     public static final InstallationDependency SLF4J_API =
         new InstallationDependency("org.slf4j", "slf4j-api", 
                 VERSION_PROPERTIES.getProperty("slf4j.version"));
@@ -150,6 +154,7 @@
         SHARED.add(TAGLIB);
         SHARED.add(CCPP_API);
         SHARED.add(CDI_IMPL);
+        SHARED.add(ANNOTATION_DETECTOR);
         SHARED.add(SLF4J_API);
         SHARED.add(SLF4J_IMPL);
     }
diff --git a/maven-pluto-plugin/src/main/resources/versions.properties b/maven-pluto-plugin/src/main/resources/versions.properties
index 7175c33..c45a5c0 100644
--- a/maven-pluto-plugin/src/main/resources/versions.properties
+++ b/maven-pluto-plugin/src/main/resources/versions.properties
@@ -23,6 +23,7 @@
 servlet-api.version=${servlet-api.version}
 jsp-api.version=${jsp-api.version}
 cdi.version=${cdi.version}
+annotation-detector.version=${annotation-detector.version}
 slf4j.version=${slf4j.version}
 jstl.version=${jstl.version}
 taglibs.standard.version=${taglibs.standard.version}
diff --git a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletContainerInitializer.java b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletContainerInitializer.java
index 9100208..7a0a82e 100644
--- a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletContainerInitializer.java
+++ b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletContainerInitializer.java
@@ -38,10 +38,6 @@
 import javax.servlet.annotation.HandlesTypes;
 
 import org.apache.pluto.container.PortletInvokerService;
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
-import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
 import org.slf4j.Logger;
@@ -79,20 +75,11 @@
 
       try {
 
-         // Get the bean configuration from the CDI extension
-
+         
+         // scan for method annotations
+         
          ConfigurationHolder holder = new ConfigurationHolder();
-         AnnotatedConfigBean acb = PortletCDIExtension.getConfig();
-         if (acb == null) {
-            holder.setMethodStore(new AnnotatedMethodStore(new ConfigSummary()));
-            if (isDebug) {
-               StringBuilder txt = new StringBuilder();
-               txt.append("CDI not available. Created new method store.");
-               LOG.debug(txt.toString());
-            }
-         } else {
-            holder.setMethodStore(acb.getMethodStore());
-         }
+         holder.scanMethodAnnotations(ctx);
 
          // Read the annotated configuration
 
@@ -171,14 +158,14 @@
             
             // Add the cross-context filter & terminal listener
             
-            FilterRegistration.Dynamic fr = ctx.addFilter("WeldCrossContextFilter", "org.jboss.weld.servlet.WeldCrossContextFilter");
-            EnumSet<DispatcherType> dt = EnumSet.noneOf(DispatcherType.class);
-            dt.add(DispatcherType.FORWARD);
-            dt.add(DispatcherType.INCLUDE);
-            dt.add(DispatcherType.ERROR);
-            fr.addMappingForUrlPatterns(dt, false, "/*");
-            
-            ctx.addListener("org.jboss.weld.servlet.WeldTerminalListener");
+//             FilterRegistration.Dynamic fr = ctx.addFilter("WeldCrossContextFilter", "org.jboss.weld.servlet.WeldCrossContextFilter");
+//             EnumSet<DispatcherType> dt = EnumSet.noneOf(DispatcherType.class);
+//             dt.add(DispatcherType.FORWARD);
+//             dt.add(DispatcherType.INCLUDE);
+//             dt.add(DispatcherType.ERROR);
+//             fr.addMappingForUrlPatterns(dt, false, "/*");
+//             
+//             ctx.addListener("org.jboss.weld.servlet.WeldTerminalListener");
 
             LOG.debug("Completed deployment of servlets & filters for context: " + ctx.getContextPath());
 
diff --git a/pluto-container/pom.xml b/pluto-container/pom.xml
index ed41612..d74fb2f 100644
--- a/pluto-container/pom.xml
+++ b/pluto-container/pom.xml
@@ -40,6 +40,12 @@
          <scope>provided</scope>
       </dependency>
 
+      <!-- For method annotation scanning ==================================== -->
+      <dependency>
+         <groupId>eu.infomas</groupId>
+         <artifactId>annotation-detector</artifactId>
+      </dependency>
+
       <!-- Specification Libraries =========================================== -->
       <dependency>
          <groupId>org.apache.portals.pluto</groupId>
@@ -61,6 +67,13 @@
          <scope>provided</scope>
       </dependency>
 
+      <!-- CDI API for extension -->
+      <dependency>
+         <groupId>javax.enterprise</groupId>
+         <artifactId>cdi-api</artifactId>
+         <version>1.2</version>
+      </dependency>
+
       <!-- Testing Libraries ================================================= -->
       <dependency>
          <groupId>org.slf4j</groupId>
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/AnnotationRecognizer.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/AnnotationRecognizer.java
index 57b344b..0739a44 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/AnnotationRecognizer.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/AnnotationRecognizer.java
@@ -113,8 +113,6 @@
             }
          }
          
-         checkForMethodAnnotations(aType.getJavaClass());
-         
       } catch (Exception e) {
          
          // The rest of the possible exceptions are unexpected, so someone will
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/MethodAnnotationRecognizer.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/MethodAnnotationRecognizer.java
new file mode 100644
index 0000000..41e16af
--- /dev/null
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/MethodAnnotationRecognizer.java
@@ -0,0 +1,244 @@
+/*  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.pluto.container.bean.processor;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.annotation.Annotation;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.portlet.annotations.ActionMethod;
+import javax.portlet.annotations.EventMethod;
+import javax.portlet.annotations.HeaderMethod;
+import javax.portlet.annotations.RenderMethod;
+import javax.portlet.annotations.ServeResourceMethod;
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import eu.infomas.annotation.AnnotationDetector;
+
+/**
+ * Uses the annotation detector to find the portlet method annotations.
+ * 
+ * @author Scott Nicklous
+ * 
+ */
+public class MethodAnnotationRecognizer extends PortletAnnotationRecognizer implements AnnotationDetector.MethodReporter {
+   private static final Logger LOG = LoggerFactory.getLogger(MethodAnnotationRecognizer.class);
+   private static final boolean isDebug = LOG.isDebugEnabled();
+   
+   private static final String  CLASSDIR  = "/WEB-INF/classes";
+   private static final String  LIBDIR    = "/WEB-INF/lib";
+   
+   private AnnotationDetector ad;
+   private Set<String> handledClasses = new HashSet<String>();
+
+
+   public MethodAnnotationRecognizer(AnnotatedMethodStore pms, ConfigSummary summary) {
+      super(pms, summary);
+      ad = new AnnotationDetector(this);
+   }
+
+   /**
+    * Defines the annotation classes to be scanned for
+    */
+   @SuppressWarnings("unchecked")
+   @Override
+   public Class<? extends Annotation>[] annotations() {
+      return new Class[] { HeaderMethod.class, ActionMethod.class, EventMethod.class, RenderMethod.class,
+            ServeResourceMethod.class };
+   }
+
+   /**
+    * Callback when a target annotation is found. Reuses superclass functionality to
+    * register all portlet annotated methods in the class.
+    */
+   @Override
+   public void reportMethodAnnotation(Class<? extends Annotation> anno, String className, String methName) {
+      
+      if (!handledClasses.contains(className)) {
+         handledClasses.add(className);
+         
+         Class<?> valClass = null;
+         StringBuilder txt = new StringBuilder(128);
+         try {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            if (cl == null) {
+               cl = this.getClass().getClassLoader();
+            }
+            valClass = cl.loadClass(className);
+         } catch (Exception e) {
+         }
+
+         if (isDebug) {
+            txt.append("Found: ").append(anno.getSimpleName());
+            txt.append(", class name: ").append(className);
+            txt.append(", method name: ").append(methName);
+            txt.append(", class: ").append((valClass == null) ? "could not be loaded." : "loaded.");
+            LOG.debug(txt.toString());
+         }
+
+         if (valClass != null) {
+            checkForMethodAnnotations(valClass);
+         }
+      }
+   }
+   
+   /**
+    * Scans the servlet context classes and libraries for portlet method
+    * annotations.
+    * 
+    * @param ctx     the servlet context
+    */
+   public void scanContext(ServletContext ctx) {
+      Set<File> files;
+      
+      files = getClassFilesForPath(ctx, CLASSDIR);
+      scanFiles(files);
+      
+      files = getLibFilesForPath(ctx, LIBDIR);
+      scanFiles(files);
+      
+      activateAnnotatedMethods(null);
+   }
+   
+   /**
+    * Scans the given set of files for annotations.
+    * 
+    * @param files   the files to scan
+    */
+   public void scanFiles(Set<File> files) {
+      
+      long start = System.currentTimeMillis();
+      try {
+         ad.detect(files.toArray(new File[0]));
+      } catch (IOException e) {
+         StringBuilder txt = new StringBuilder(128);
+         txt.append("Exception scanning for method annotations.");
+         
+         StringWriter sw = new StringWriter();
+         PrintWriter pw = new PrintWriter(sw);
+         e.printStackTrace(pw);
+         pw.flush();
+         txt.append(sw.toString());
+         
+         LOG.warn(txt.toString());
+      }
+      long delta = System.currentTimeMillis() - start;
+      
+      if (isDebug) {
+         StringBuilder txt = new StringBuilder();
+         txt.append("Scanned ").append(files.size()).append(" files.");
+         txt.append(" Time: ").append(delta).append(" ms.");
+         txt.append("Files: ");
+         String sep = "";
+         for (File file : files) {
+            txt.append(sep).append(file.toString());
+            sep = ", ";
+         }
+         LOG.debug(txt.toString());
+      }
+   }
+   
+
+   /**
+    * Generates a list of all class files available on a given servlet context 
+    * resource path.
+    * 
+    * @param ctx     the servlet context
+    * @param path    the resource path
+    * 
+    * @return        a set of class files
+    */
+   private Set<File> getClassFilesForPath(ServletContext ctx, String path) {
+      Set<File> files = new HashSet<File>();
+      Set<String> paths = ctx.getResourcePaths(path);
+      if (paths != null) {
+         for (String pth : paths) {
+            if (pth.endsWith("META-INF/")) {
+               continue;
+            } else if (pth.endsWith("/")) {
+               files.addAll(getClassFilesForPath(ctx, pth));
+            } else if (pth.endsWith(".class")) {
+               try {
+                  URL url = ctx.getResource(pth);
+                  File f = new File(url.toURI());
+                  files.add(f);
+               } catch(Exception e) {
+                  StringBuilder txt = new StringBuilder(128);
+                  txt.append("Exception getting library file.");
+
+                  StringWriter sw = new StringWriter();
+                  PrintWriter pw = new PrintWriter(sw);
+                  e.printStackTrace(pw);
+                  pw.flush();
+                  txt.append(sw.toString());
+
+                  LOG.warn(txt.toString());
+               }
+            }
+         }
+      }
+      return files;
+   }
+
+   /**
+    * Returns a set of all library files in the designated servlet context resource path.
+    * 
+    * @param ctx     the servlet context
+    * @param path    the resource path
+    * 
+    * @return        a set of class files
+    */
+   private Set<File> getLibFilesForPath(ServletContext ctx, String path) {
+      Set<File> files = new HashSet<File>();
+      Set<String> libs = ctx.getResourcePaths(path);
+      if (libs != null) {
+         for (String lib : libs) {
+            if (lib.endsWith(".jar")) {
+               try {
+                  URL url = ctx.getResource(lib);
+                  File f = new File(url.toURI());
+                  files.add(f);
+               } catch(Exception e) {
+                  StringBuilder txt = new StringBuilder(128);
+                  txt.append("Exception getting library file.");
+                  
+                  StringWriter sw = new StringWriter();
+                  PrintWriter pw = new PrintWriter(sw);
+                  e.printStackTrace(pw);
+                  pw.flush();
+                  txt.append(sw.toString());
+                  
+                  LOG.warn(txt.toString());
+               }
+            }
+         }
+      }
+      return files;
+   }
+
+
+}
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletAnnotationRecognizer.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletAnnotationRecognizer.java
index 99e5da9..1eb52cc 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletAnnotationRecognizer.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletAnnotationRecognizer.java
@@ -375,7 +375,7 @@
     * verify that the stored methods are consistent.
     */
    @Override
-   protected void activateAnnotatedMethods(BeanManager bm) {
+   public void activateAnnotatedMethods(BeanManager bm) {
       
       // Verify the portlet names in the proxied method store. It is an error if:
       // 1) There is no method for a given name, but configuration data exists
@@ -415,9 +415,6 @@
          }
       }
       
-      //TODO: remove ams initialization
-      ams.activateMethods(bm);
-      
    }
 
    /**
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationHolder.java b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationHolder.java
index 0ec2f34..7fc6a75 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationHolder.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationHolder.java
@@ -18,6 +18,7 @@
 
 package org.apache.pluto.container.om.portlet.impl;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Set;
@@ -29,6 +30,7 @@
 import javax.portlet.annotations.PortletListener;
 import javax.portlet.annotations.PortletPreferencesValidator;
 import javax.portlet.annotations.PortletLifecycleFilter;
+import javax.servlet.ServletContext;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
@@ -38,6 +40,8 @@
 import javax.xml.stream.XMLStreamReader;
 
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
+import org.apache.pluto.container.bean.processor.MethodAnnotationRecognizer;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.slf4j.Logger;
@@ -64,7 +68,8 @@
                                                            + "org.apache.pluto.container.om.portlet20.impl:"
                                                            + "org.apache.pluto.container.om.portlet30.impl";
 
-   private AnnotatedMethodStore methodStore;
+   private ConfigSummary configSummary = new ConfigSummary();
+   private AnnotatedMethodStore methodStore = new AnnotatedMethodStore(configSummary);
    private boolean portletsInstantiated = false;
    
    /**
@@ -106,6 +111,20 @@
    }
 
    /**
+    * @return the configSummary
+    */
+   public ConfigSummary getConfigSummary() {
+      return configSummary;
+   }
+
+   /**
+    * @param configSummary the configSummary to set
+    */
+   public void setConfigSummary(ConfigSummary configSummary) {
+      this.configSummary = configSummary;
+   }
+
+   /**
     * Processes the portlet deployment descriptor represented by the given input stream.
     * <p>
     * The data is merged into an existing configuration data structure if one is provided. This capability is used by
@@ -306,5 +325,29 @@
       jcp.reconcileBeanConfig(ams);
       jcp.instantiatePortlets(ams, ams.getBeanMgr());
    }
+   
+   /**
+    * Scans servlet context for method annotations.
+    * 
+    * @param ctx  the servlet context
+    */
+   public void scanMethodAnnotations(ServletContext ctx) {
+      MethodAnnotationRecognizer mar = new MethodAnnotationRecognizer(methodStore, configSummary);
+      mar.scanContext(ctx);
+      LOG.debug("Scan complete: \n" + methodStore.getMethodsAsString());
+   }
+   
+   /**
+    * Scans list of files for method annotations.
+    * (unit test execution path)
+    * 
+    * @param files   the set of files to scan
+    */
+   public void scanMethodAnnotations(Set<File> files) {
+      MethodAnnotationRecognizer mar = new MethodAnnotationRecognizer(methodStore, configSummary);
+      mar.scanFiles(files);
+      mar.activateAnnotatedMethods(null);
+      LOG.debug("Scan complete: \n" + methodStore.getMethodsAsString());
+   }
 
 }
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationProcessor.java b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationProcessor.java
index 2f3d75f..8b9f400 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationProcessor.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/ConfigurationProcessor.java
@@ -16,6 +16,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Random;
@@ -619,7 +620,7 @@
       if (isDebug) {
          StringBuilder txt = new StringBuilder();
          txt.append("Instantiating the portlets.");
-         txt.append(" bean mgr = null: ").append(bm == null);
+         txt.append(" beanMgr: ").append((bm == null) ? "null" : "not null");
          txt.append(", portlet names: ").append(Arrays.toString(ams.getPortletNames().toArray()));
          LOG.debug(txt.toString());
       }
@@ -627,7 +628,9 @@
       ams.activateMethods(bm);
     
       for (PortletDefinition pd : pad.getPortlets()) {
+         Set<Class<?>> processedClasses = new HashSet<Class<?>>();
          String clsName = pd.getPortletClass();
+         Object instance = null;
          
          if (clsName != null) {
             ClassLoader cl = Thread.currentThread().getContextClassLoader();
@@ -636,7 +639,7 @@
             }
             try {
                Class<?> cls = cl.loadClass(clsName);
-               Object instance = null;
+               processedClasses.add(cls);
                
                // Let CDI instantiate the portlet to allow for injection. 
                // Get the single bean instance for the portlet class.
@@ -710,6 +713,35 @@
             }
 
          }
+         
+         if (bm == null) {
+            
+            // Running in an environment without CDI support, the portlet classes
+            // need to be instantiated in such a way that all methods of a given portlet and
+            // a given class use the same instance of that class. Also, annotated portlet
+            // methods can appear in classes that do not implement the Portlet interface
+            // and those classes need to be instantiated as well.
+            
+            for (MethodIdentifier mi : ams.getMethodIDsForPortlet(pd.getPortletName())) {
+               for (AnnotatedMethod am : ams.getMethods(mi)) {
+                  Class<?> cls = am.getBeanClass();
+                  if (!processedClasses.contains(cls)) {
+                     processedClasses.add(cls);
+                     try {
+                        instance = cls.newInstance();
+                        ams.setPortletClassInstance(pd.getPortletName(), cls, instance);
+                     } catch (Exception e) {
+                        StringBuilder txt = new StringBuilder(128);
+                        txt.append("Exception creating instance of class: ").append(e.toString());
+                        txt.append(" Portlet name: ").append(pd.getPortletName());
+                        txt.append(", portlet class: ").append(cls);
+                        LOG.warn(txt.toString());
+                     }
+                  }
+               }
+            }
+
+         }
       }
    }
    
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/InvocationResults.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/InvocationResults.java
index 5c2e24c..9c4b9a1 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/InvocationResults.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/InvocationResults.java
@@ -33,6 +33,21 @@
 
    private List<String> methods = new ArrayList<String>();
    boolean configExists = false;
+   
+   private static InvocationResults results;
+
+   /**
+    * singleton
+    */
+   private InvocationResults() {
+   }
+   
+   public static InvocationResults getInvocationResults() {
+      if (results == null) {
+         results = new InvocationResults();
+      }
+      return results;
+   }
 
    /**
     * @return the methods
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action1.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action1.java
index a0a03d9..35c0631 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action1.java
@@ -19,11 +19,13 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.action;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.annotations.ActionMethod;
+import javax.portlet.annotations.EventDefinition;
+import javax.portlet.annotations.PortletApplication;
 import javax.portlet.annotations.PortletQName;
+import javax.portlet.annotations.RenderMethod;
 
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 
@@ -31,10 +33,19 @@
  * @author Scott Nicklous
  *
  */
+@PortletApplication(
+      defaultNamespaceURI="https://www.java.net/",
+      events = {
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub1")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub2")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub3")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub4")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="", localPart="event4"))
+      }
+      )
 public class Action1 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @ActionMethod(portletName="portlet1", 
          publishingEvents= {
@@ -49,5 +60,9 @@
       meths.addMethod(this.getClass().getSimpleName() + "#action2");
    }
    
+   // dummy render method to keep config processor happy
+   
+   @RenderMethod(portletNames= {"portlet1", "portlet2", "portlet3", "portlet6"})
+   public void render1() {}
 
 }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action2.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action2.java
index 360a20c..f650022 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/action/Action2.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.action;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.annotations.ActionMethod;
@@ -33,8 +32,7 @@
  */
 public class Action2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @ActionMethod(portletName="portlet3",
          publishingEvents= {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event1.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event1.java
index 1d90cff..95b40ec 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event1.java
@@ -19,11 +19,13 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.event;
 
-import javax.inject.Inject;
 import javax.portlet.EventRequest;
 import javax.portlet.EventResponse;
+import javax.portlet.annotations.EventDefinition;
 import javax.portlet.annotations.EventMethod;
+import javax.portlet.annotations.PortletApplication;
 import javax.portlet.annotations.PortletQName;
+import javax.portlet.annotations.RenderMethod;
 
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 
@@ -31,10 +33,25 @@
  * @author Scott Nicklous
  *
  */
+@PortletApplication(
+      defaultNamespaceURI="https://www.java.net/",
+      events = {
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub1")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub2")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="pub3")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="https://www.java.net/", localPart="pub4")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="proc1")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="proc2")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="proc3a")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="proc3c")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="https://www.java.net/", localPart="proc3b")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="http://www.apache.org", localPart="proc6")),
+            @EventDefinition(qname=@PortletQName(namespaceURI="", localPart="event4"))
+      }
+      )
 public class Event1 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @EventMethod(portletName="portlet1", 
          processingEvents= {
@@ -55,5 +72,10 @@
       meths.addMethod(this.getClass().getSimpleName() + "#event2");
    }
    
+   // dummy render method to keep config processor happy
+   
+   @RenderMethod(portletNames= {"portlet1", "portlet2"})
+   public void render1() {}
+   
 
 }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event2.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event2.java
index 88fe4f2..687cd00 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/event/Event2.java
@@ -19,11 +19,11 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.event;
 
-import javax.inject.Inject;
 import javax.portlet.EventRequest;
 import javax.portlet.EventResponse;
 import javax.portlet.annotations.EventMethod;
 import javax.portlet.annotations.PortletQName;
+import javax.portlet.annotations.RenderMethod;
 
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 
@@ -33,8 +33,7 @@
  */
 public class Event2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @EventMethod(portletName="portlet3",
          processingEvents= {
@@ -115,6 +114,11 @@
    public void event7(EventRequest req, EventResponse resp) {
       meths.addMethod(this.getClass().getSimpleName() + "#event7");
    }
+   
+   // dummy render method to keep config processor happy
+   
+   @RenderMethod(portletNames= {"portlet3", "portlet6"})
+   public void render1() {}
 
 
 }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header1.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header1.java
index c5eff06..5f44fb4 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header1.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.header;
 
-import javax.inject.Inject;
 import javax.portlet.HeaderRequest;
 import javax.portlet.HeaderResponse;
 import javax.portlet.annotations.HeaderMethod;
@@ -32,8 +31,7 @@
  */
 public class Header1 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @HeaderMethod(portletNames="portlet1")
    public void header1a(HeaderRequest req, HeaderResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header2.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header2.java
index 0aee0ef..62255da 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/header/Header2.java
@@ -20,7 +20,6 @@
 package org.apache.pluto.container.bean.processor.fixtures.header;
 
 import javax.activity.InvalidActivityException;
-import javax.inject.Inject;
 import javax.portlet.HeaderRequest;
 import javax.portlet.HeaderResponse;
 import javax.portlet.annotations.HeaderMethod;
@@ -33,8 +32,7 @@
  */
 public class Header2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @HeaderMethod(portletNames="portlet2", portletMode="edit", ordinal=-100)
    public void header2c(HeaderRequest req, HeaderResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render1.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render1.java
index 857d3c1..9b92566 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render1.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.render;
 
-import javax.inject.Inject;
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
 import javax.portlet.annotations.RenderMethod;
@@ -32,8 +31,7 @@
  */
 public class Render1 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @RenderMethod(portletNames="portlet1")
    public void render1a(RenderRequest req, RenderResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render2.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render2.java
index 031af11..e34cd19 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/render/Render2.java
@@ -20,7 +20,6 @@
 package org.apache.pluto.container.bean.processor.fixtures.render;
 
 import javax.activity.InvalidActivityException;
-import javax.inject.Inject;
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
 import javax.portlet.annotations.RenderMethod;
@@ -33,8 +32,7 @@
  */
 public class Render2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @RenderMethod(portletNames="portlet2", portletMode="edit", ordinal=-100)
    public void render2c(RenderRequest req, RenderResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource1.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource1.java
index 4d44be3..b31d05c 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource1.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.bean.processor.fixtures.resource;
 
-import javax.inject.Inject;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
 import javax.portlet.annotations.ServeResourceMethod;
@@ -32,8 +31,7 @@
  */
 public class Resource1 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @ServeResourceMethod(portletNames="portlet1")
    public void resource1a(ResourceRequest req, ResourceResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource2.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource2.java
index 4ff9811..aa51b08 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/resource/Resource2.java
@@ -20,7 +20,6 @@
 package org.apache.pluto.container.bean.processor.fixtures.resource;
 
 import javax.activity.InvalidActivityException;
-import javax.inject.Inject;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
 import javax.portlet.annotations.ServeResourceMethod;
@@ -33,8 +32,7 @@
  */
 public class Resource2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @ServeResourceMethod(portletNames="portlet2", resourceID="edit", ordinal=-100)
    public void resource2c(ResourceRequest req, ResourceResponse resp) {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ActionTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ActionTest.java
index 98d35b5..6ae69dc 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ActionTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ActionTest.java
@@ -16,36 +16,34 @@
  *  under the License.
  */
 
-
 package org.apache.pluto.container.bean.processor.tests;
 
 import static org.apache.pluto.container.bean.processor.MethodType.ACTION;
+import static org.apache.pluto.container.bean.processor.MethodType.RENDER;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.MethodType;
 import org.apache.pluto.container.bean.processor.fixtures.action.Action1;
 import org.apache.pluto.container.bean.processor.fixtures.action.Action2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for action method annotations.
@@ -53,27 +51,25 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Action1.class)
 public class ActionTest {
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
-      
+
+   private static final String         pkg     = "org.apache.pluto.container.bean.processor.fixtures.action";
+
+   private static AnnotatedMethodStore ams     = null;
+   private static ConfigSummary        summary = null;
+   private static ConfigurationHolder  holder  = new ConfigurationHolder();
+
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+
       assertNotNull(ams);
       assertNotNull(summary);
    }
-   
+
    @Test
    public void portletNamesTest() throws Exception {
       Set<String> names = ams.getPortletNames();
@@ -84,7 +80,7 @@
       assertTrue(names.contains("portlet3"));
       assertTrue(names.contains("portlet6"));
    }
-   
+
    @Test
    public void errorDuplicateMethod() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -92,7 +88,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet2"));
    }
-   
+
    @Test
    public void errorDuplicateMethod2() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -100,7 +96,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet6"));
    }
-   
+
    @Test
    public void errorBadReturnType() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -108,7 +104,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet5"));
    }
-   
+
    @Test
    public void errorBadParameters() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -116,42 +112,49 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet4"));
    }
-   
+
    @Test
    public void methods1Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet1");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
-      assertEquals(ACTION, mi.getType());
+      if (!mi.getType().equals(ACTION)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       assertEquals("", mi.getId());
       assertEquals("portlet1", mi.getName());
    }
-   
+
    @Test
    public void methods2Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet2");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
-      assertEquals(ACTION, mi.getType());
+      List<MethodType> types = Arrays.asList(ACTION, RENDER);
+      assertTrue(types.contains(mi.getType()));
+      if (!mi.getType().equals(ACTION)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       assertEquals("", mi.getId());
       assertEquals("portlet2", mi.getName());
    }
-   
+
    @Test
    public void methods3Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet3");
       assertNotNull(portlets);
-      assertEquals(3, portlets.size());
-      List<String> ids = Arrays.asList(new String[] {"", "Fred", "Barney"});
+      assertEquals(4, portlets.size());
+      List<String> ids = Arrays.asList(new String[] { "", "Fred", "Barney" });
       for (MethodIdentifier mi : portlets) {
-         assertEquals(ACTION, mi.getType());
-         assertTrue(ids.contains(mi.getId()));
-         assertEquals("portlet3", mi.getName());
+         if (mi.getType().equals(ACTION)) {
+            assertTrue(ids.contains(mi.getId()));
+            assertEquals("portlet3", mi.getName());
+         }
       }
    }
-   
+
    @Test
    public void class1Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet1", "", ACTION);
@@ -162,7 +165,7 @@
       assertEquals("action1", m.getName());
       assertEquals(Action1.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class2Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet2", "", ACTION);
@@ -172,10 +175,10 @@
       assertNotNull(m);
       assertEquals("action2", m.getName());
       // don't know which one the scanner will find first
-      List<Class<?>> list = Arrays.asList(new Class<?>[] {Action1.class, Action2.class});
+      List<Class<?>> list = Arrays.asList(new Class<?>[] { Action1.class, Action2.class });
       assertTrue(list.contains(m.getDeclaringClass()));
    }
-   
+
    @Test
    public void class3Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet3", "", ACTION);
@@ -186,7 +189,7 @@
       assertEquals("action1a", m.getName());
       assertEquals(Action2.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class4Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet3", "Fred", ACTION);
@@ -197,7 +200,7 @@
       assertEquals("action1b", m.getName());
       assertEquals(Action2.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class5Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet3", "Barney", ACTION);
@@ -208,7 +211,7 @@
       assertEquals("action1c", m.getName());
       assertEquals(Action2.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class6Test() throws Exception {
       MethodIdentifier mi = new MethodIdentifier("portlet6", "Wilma", ACTION);
@@ -216,10 +219,11 @@
       assertNotNull(am);
       Method m = am.getJavaMethod();
       assertNotNull(m);
-      assertEquals("action6", m.getName());
+      List<String> names = Arrays.asList("action6", "action7");
+      assertTrue(names.contains(m.getName()));
       assertEquals(Action2.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void pubEvent1Test() throws Exception {
       List<QName> qns = ams.getPublishingEventRefs("portlet1");
@@ -227,7 +231,7 @@
       assertEquals(1, qns.size());
       assertTrue(qns.contains(new QName("http://www.apache.org", "pub1")));
    }
-   
+
    @Test
    public void pubEvent2Test() throws Exception {
       List<QName> qns = ams.getPublishingEventRefs("portlet3");
@@ -238,5 +242,5 @@
       assertTrue(qns.contains(new QName("http://www.apache.org", "pub3")));
       assertTrue(qns.contains(new QName("http://www.apache.org", "pub4")));
    }
-   
+
 }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventFixupTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventFixupTest.java
index 55b1831..959ad50 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventFixupTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventFixupTest.java
@@ -16,7 +16,6 @@
  *  under the License.
  */
 
-
 package org.apache.pluto.container.bean.processor.tests;
 
 import static org.apache.pluto.container.bean.processor.MethodType.EVENT;
@@ -24,28 +23,25 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event1;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for RenderStateScoped beans
@@ -53,30 +49,29 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Event1.class)
 public class EventFixupTest {
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
-   
-   private static String DEFAULT_NS = "http://www.java.net/";
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
-      
+
+   private static String               DEFAULT_NS = "http://www.java.net/";
+
+   private static final String         pkg        = "org.apache.pluto.container.bean.processor.fixtures.event";
+
+   private static AnnotatedMethodStore ams        = null;
+   private static ConfigSummary        summary    = null;
+   private static ConfigurationHolder  holder     = new ConfigurationHolder();
+
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+
       assertNotNull(ams);
       assertNotNull(summary);
+
       ams.setDefaultNamespace(DEFAULT_NS);
    }
-   
+
    @Test
    public void portletNamesTest() throws Exception {
       Set<String> names = ams.getPortletNames();
@@ -87,7 +82,7 @@
       assertTrue(names.contains("portlet3"));
       assertTrue(names.contains("portlet6"));
    }
-   
+
    @Test
    public void errorDuplicateMethod() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -95,7 +90,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet2"));
    }
-   
+
    @Test
    public void errorDuplicateMethod2() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -103,7 +98,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet6"));
    }
-   
+
    @Test
    public void errorBadReturnType() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -111,7 +106,7 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet5"));
    }
-   
+
    @Test
    public void errorBadParameters() throws Exception {
       List<String> names = summary.getPortletsWithErrors();
@@ -119,48 +114,51 @@
       assertEquals(4, names.size());
       assertTrue(names.contains("portlet4"));
    }
-   
+
    @Test
    public void methods1Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet1");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
-      assertEquals(EVENT, mi.getType());
+      if (!mi.getType().equals(EVENT)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       QName qn = new QName("http://www.apache.org", "proc1");
       assertEquals(qn, mi.getId());
       assertEquals("portlet1", mi.getName());
    }
-   
+
    @Test
    public void methods2Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet2");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
-      assertEquals(EVENT, mi.getType());
+      if (!mi.getType().equals(EVENT)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       QName qn = new QName("http://www.apache.org", "proc2");
       assertEquals(qn, mi.getId());
       assertEquals("portlet2", mi.getName());
    }
-   
+
    @Test
    public void methods3Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet3");
       assertNotNull(portlets);
-      assertEquals(3, portlets.size());
-      List<QName> ids = Arrays.asList(new QName[] {
-            new QName("http://www.apache.org", "proc3a"),
-            new QName(DEFAULT_NS, "proc3b"),
-            new QName("http://www.apache.org", "proc3c"),
-      });
+      assertEquals(4, portlets.size());
+      List<QName> ids = Arrays.asList(new QName[] { new QName("http://www.apache.org", "proc3a"),
+            new QName(DEFAULT_NS, "proc3b"), new QName("http://www.apache.org", "proc3c"), });
       for (MethodIdentifier mi : portlets) {
-         assertEquals(EVENT, mi.getType());
-         assertTrue(ids.contains(mi.getId()));
-         assertEquals("portlet3", mi.getName());
+         if (mi.getType().equals(EVENT)) {
+            assertEquals(EVENT, mi.getType());
+            assertTrue(ids.contains(mi.getId()));
+            assertEquals("portlet3", mi.getName());
+         }
       }
    }
-   
+
    @Test
    public void class1Test() throws Exception {
       QName qn = new QName("http://www.apache.org", "proc1");
@@ -175,7 +173,7 @@
       assertEquals("event1", m.getName());
       assertEquals(Event1.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class2Test() throws Exception {
       QName qn = new QName("http://www.apache.org", "proc2");
@@ -189,10 +187,10 @@
       assertNotNull(m);
       assertEquals("event2", m.getName());
       // don't know which one the scanner will find first
-      List<Class<?>> clslst = Arrays.asList(new Class<?>[] {Event1.class, Event2.class});
+      List<Class<?>> clslst = Arrays.asList(new Class<?>[] { Event1.class, Event2.class });
       assertTrue(clslst.contains(m.getDeclaringClass()));
    }
-   
+
    @Test
    public void class6Test() throws Exception {
       QName qn = new QName("http://www.apache.org", "proc6");
@@ -205,27 +203,30 @@
       Method m = am.getJavaMethod();
       assertNotNull(m);
       // order in which method found undefined
-      List<String> names = Arrays.asList(new String[] {"event6", "event7"});
+      List<String> names = Arrays.asList(new String[] { "event6", "event7" });
       assertTrue(names.contains(m.getName()));
       assertEquals(Event2.class, m.getDeclaringClass());
    }
-   
+
    @Test
    public void class4Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet3");
       assertNotNull(portlets);
-      assertEquals(3, portlets.size());
+      assertEquals(4, portlets.size());
 
-      List<String> methNames = Arrays.asList(new String[] {"event1a", "event1b", "event1c"});
+      List<String> methNames = Arrays.asList(new String[] { "event1a", "event1b", "event1c", "render1" });
       for (MethodIdentifier mi : portlets) {
-         AnnotatedMethod am = ams.getMethod(mi);
+         List<AnnotatedMethod> meths = ams.getMethods(mi); 
+         assertEquals(1, meths.size());
+         AnnotatedMethod am = meths.get(0);
+         assertNotNull(am);
          Method m = am.getJavaMethod();
          assertNotNull(m);
          assertTrue(methNames.contains(m.getName()));
          assertEquals(Event2.class, m.getDeclaringClass());
       }
    }
-   
+
    @Test
    public void pubEvent1Test() throws Exception {
       List<QName> qns = ams.getPublishingEventRefs("portlet1");
@@ -233,7 +234,7 @@
       assertEquals(1, qns.size());
       assertTrue(qns.contains(new QName("http://www.apache.org", "pub1")));
    }
-   
+
    @Test
    public void pubEvent2Test() throws Exception {
       List<QName> qns = ams.getPublishingEventRefs("portlet3");
@@ -244,7 +245,7 @@
       assertTrue(qns.contains(new QName("http://www.apache.org", "pub3")));
       assertTrue(qns.contains(new QName(DEFAULT_NS, "pub4")));
    }
-   
+
    @Test
    public void procEvent1Test() throws Exception {
       List<QName> qns = ams.getProcessingEventRefs("portlet1");
@@ -252,7 +253,7 @@
       assertEquals(1, qns.size());
       assertTrue(qns.contains(new QName("http://www.apache.org", "proc1")));
    }
-   
+
    @Test
    public void procEvent2Test() throws Exception {
       List<QName> qns = ams.getProcessingEventRefs("portlet2");
@@ -260,7 +261,7 @@
       assertEquals(1, qns.size());
       assertTrue(qns.contains(new QName("http://www.apache.org", "proc2")));
    }
-   
+
    @Test
    public void procEvent3Test() throws Exception {
       List<QName> qns = ams.getProcessingEventRefs("portlet3");
@@ -270,7 +271,7 @@
       assertTrue(qns.contains(new QName(DEFAULT_NS, "proc3b")));
       assertTrue(qns.contains(new QName("http://www.apache.org", "proc3c")));
    }
-   
+
    @Test
    public void procEvent6Test() throws Exception {
       List<QName> qns = ams.getProcessingEventRefs("portlet6");
@@ -278,5 +279,5 @@
       assertEquals(1, qns.size());
       assertTrue(qns.contains(new QName("http://www.apache.org", "proc6")));
    }
-   
+
 }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventTest.java
index 5e516bc..f8faee1 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/EventTest.java
@@ -24,29 +24,26 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event1;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for event method annotations
@@ -54,25 +51,25 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Event1.class)
 public class EventTest {
    
-   @Inject
-   AnnotatedConfigBean acb;
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.event";
    
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
       
       assertNotNull(ams);
       assertNotNull(summary);
+
    }
    
    @Test
@@ -122,8 +119,11 @@
    public void methods1Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet1");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
+      if (!mi.getType().equals(EVENT)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       assertEquals(EVENT, mi.getType());
       QName qn = new QName("http://www.apache.org", "proc1");
       assertEquals(qn, mi.getId());
@@ -134,8 +134,11 @@
    public void methods2Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet2");
       assertNotNull(portlets);
-      assertEquals(1, portlets.size());
+      assertEquals(2, portlets.size());
       MethodIdentifier mi = (MethodIdentifier) portlets.toArray()[0];
+      if (!mi.getType().equals(EVENT)) {
+         mi = (MethodIdentifier) portlets.toArray()[1];
+      }
       assertEquals(EVENT, mi.getType());
       QName qn = new QName("http://www.apache.org", "proc2");
       assertEquals(qn, mi.getId());
@@ -146,16 +149,17 @@
    public void methods3Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet3");
       assertNotNull(portlets);
-      assertEquals(3, portlets.size());
+      assertEquals(4, portlets.size());
       List<QName> ids = Arrays.asList(new QName[] {
             new QName("http://www.apache.org", "proc3a"),
             new QName(XMLConstants.NULL_NS_URI, "proc3b"),
             new QName("http://www.apache.org", "proc3c"),
       });
       for (MethodIdentifier mi : portlets) {
-         assertEquals(EVENT, mi.getType());
-         assertTrue(ids.contains(mi.getId()));
-         assertEquals("portlet3", mi.getName());
+         if (mi.getType().equals(EVENT)) {
+            assertTrue(ids.contains(mi.getId()));
+            assertEquals("portlet3", mi.getName());
+         }
       }
    }
    
@@ -212,11 +216,13 @@
    public void class4Test() throws Exception {
       Set<MethodIdentifier> portlets = ams.getMethodIDsForPortlet("portlet3");
       assertNotNull(portlets);
-      assertEquals(3, portlets.size());
+      assertEquals(4, portlets.size());
 
-      List<String> methNames = Arrays.asList(new String[] {"event1a", "event1b", "event1c"});
+      List<String> methNames = Arrays.asList(new String[] {"event1a", "event1b", "event1c", "render1"});
       for (MethodIdentifier mi : portlets) {
-         AnnotatedMethod am = ams.getMethod(mi);
+         List<AnnotatedMethod> meths = ams.getMethods(mi); 
+         assertEquals(1, meths.size());
+         AnnotatedMethod am = meths.get(0);
          Method m = am.getJavaMethod();
          assertNotNull(m);
          assertTrue(methNames.contains(m.getName()));
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/FileHelper.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/FileHelper.java
new file mode 100644
index 0000000..87259da
--- /dev/null
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/FileHelper.java
@@ -0,0 +1,67 @@
+/*  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.pluto.container.bean.processor.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Methods to help handle class files.
+ * 
+ * @author Scott Nicklous
+ *
+ */
+public class FileHelper {
+
+   /**
+    * Returns a set of all class files for given package.
+    * 
+    * @param pkg        the package
+    * @return           set of classes
+    * @throws URISyntaxException
+    * @throws IOException
+    */
+   public static Set<File> getClasses(String pkg) throws URISyntaxException, IOException {
+      Set<File> classes = new HashSet<File>();
+
+      ClassLoader cl = Thread.currentThread().getContextClassLoader();
+      
+      List<URL> urls = Collections.list(cl.getResources(pkg.replaceAll("\\.", "/")));
+      for (URL url : urls) {
+         File dir = new File(url.toURI());
+         if (dir.isDirectory()) {
+            for (File file : dir.listFiles()) {
+               if (file.isFile() && file.getAbsolutePath().endsWith(".class")) {
+                  classes.add(file);
+               }
+            }
+         }
+      }
+
+      return classes;
+   }
+
+}
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/HeaderTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/HeaderTest.java
index 2368521..4d84855 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/HeaderTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/HeaderTest.java
@@ -19,34 +19,31 @@
 package org.apache.pluto.container.bean.processor.tests;
 
 import static org.apache.pluto.container.bean.processor.MethodType.HEADER;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.fixtures.header.Header1;
 import org.apache.pluto.container.bean.processor.fixtures.header.Header2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for header method annotations
@@ -54,23 +51,23 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Header1.class)
 public class HeaderTest {
-
-   @Inject
-   AnnotatedConfigBean          acb;
-
-   private AnnotatedMethodStore ams     = null;
-   private ConfigSummary        summary = null;
-
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
-
+   
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.header";
+   
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      
       assertNotNull(ams);
       assertNotNull(summary);
    }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeActionTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeActionTest.java
index 66f1c1b..8805d3f 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeActionTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeActionTest.java
@@ -23,27 +23,25 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
-import javax.inject.Inject;
-
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 import org.apache.pluto.container.bean.processor.fixtures.action.Action1;
 import org.apache.pluto.container.bean.processor.fixtures.action.Action2;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockActionRequest;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockActionResponse;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for invoking the annotated action methods.
@@ -51,28 +49,30 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Action1.class)
 public class InvokeActionTest {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private static MockActionRequest req = new MockActionRequest();
    private static MockActionResponse resp = new MockActionResponse();
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private static final Set<Class<?>> annotatedClasses =
+         new HashSet<Class<?>>(Arrays.asList(Action1.class)); 
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.action";
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
    
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.processConfigAnnotations(annotatedClasses);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
       
       assertNotNull(ams);
       assertNotNull(summary);
@@ -81,7 +81,7 @@
    @Test
    public void invoke1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       req.setActionName(null);
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
@@ -93,7 +93,7 @@
    @Test
    public void invoke2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       req.setActionName(null);
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
@@ -110,7 +110,7 @@
    @Test
    public void invoke3a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       req.setActionName("");
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
@@ -122,7 +122,7 @@
    @Test
    public void invoke3b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       req.setActionName("Fred");
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
@@ -134,7 +134,7 @@
    @Test
    public void invoke3c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       req.setActionName("Barney");
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
@@ -146,7 +146,7 @@
    @Test
    public void invoke6() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       req.setActionName("Wilma");
       i.processAction(req, resp);
       List<String> names = meths.getMethods();
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeEventTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeEventTest.java
index bea9920..88f9be1 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeEventTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeEventTest.java
@@ -23,28 +23,27 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event1;
 import org.apache.pluto.container.bean.processor.fixtures.event.Event2;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockEventRequest;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockEventResponse;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for invoking the annotated event methods.
@@ -52,40 +51,40 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Event1.class)
 public class InvokeEventTest {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private static final MockEventRequest req = new MockEventRequest();
    private static final MockEventResponse resp = new MockEventResponse();
+   private static String DEFAULT_NS = "https://www.java.net/";
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private static final Set<Class<?>> annotatedClasses =
+         new HashSet<Class<?>>(Arrays.asList(Event1.class)); 
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.event";
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
    
-   private static String DEFAULT_NS = "http://www.java.net/";
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.processConfigAnnotations(annotatedClasses);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
       
       assertNotNull(ams);
       assertNotNull(summary);
-      ams.setDefaultNamespace(DEFAULT_NS);
    }
    
    @Test
    public void invoke1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       QName qn = new QName("http://www.apache.org", "proc1");
       req.setQn(qn);
       i.processEvent(req, resp);
@@ -98,7 +97,7 @@
    @Test
    public void invoke2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       QName qn = new QName("http://www.apache.org", "proc2");
       req.setQn(qn);
       i.processEvent(req, resp);
@@ -116,7 +115,7 @@
    @Test
    public void invoke3a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       QName qn = new QName("http://www.apache.org", "proc3a");
       req.setQn(qn);
       i.processEvent(req, resp);
@@ -129,7 +128,7 @@
    @Test
    public void invoke3b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       QName qn = new QName(DEFAULT_NS, "proc3b");
       req.setQn(qn);
       i.processEvent(req, resp);
@@ -142,7 +141,7 @@
    @Test
    public void invoke3c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       QName qn = new QName("http://www.apache.org", "proc3c");
       req.setQn(qn);
       i.processEvent(req, resp);
@@ -155,7 +154,7 @@
    @Test
    public void invoke6() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       QName qn = new QName("http://www.apache.org", "proc6");
       req.setQn(qn);
       i.processEvent(req, resp);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeHeaderTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeHeaderTest.java
index adac9e4..c48ebd5 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeHeaderTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeHeaderTest.java
@@ -24,28 +24,26 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 import org.apache.pluto.container.bean.processor.fixtures.header.Header1;
 import org.apache.pluto.container.bean.processor.fixtures.header.Header2;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockHeaderRequest;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockHeaderResponse;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for invoking the annotated header methods.
@@ -53,40 +51,36 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Header1.class)
 public class InvokeHeaderTest {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private static final MockHeaderRequest req = new MockHeaderRequest();
    private static final MockHeaderResponse resp = new MockHeaderResponse();
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.header";
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
    
-   private static String DEFAULT_NS = "http://www.java.net/";
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
       
       assertNotNull(ams);
       assertNotNull(summary);
-      ams.setDefaultNamespace(DEFAULT_NS);
    }
    
    @Test
    public void invoke1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -106,7 +100,7 @@
    @Test
    public void invoke1a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -126,7 +120,7 @@
    @Test
    public void invoke1b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = new PortletMode("CustomMode");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -146,7 +140,7 @@
    @Test
    public void invoke2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -158,7 +152,7 @@
    @Test
    public void invoke2a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -176,7 +170,7 @@
    @Test
    public void invoke2b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = new PortletMode("Config");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -194,7 +188,7 @@
    @Test
    public void invoke2c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.EDIT;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -212,7 +206,7 @@
    @Test
    public void invoke3a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -228,7 +222,7 @@
    @Test
    public void invoke3b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -246,7 +240,7 @@
    @Test
    public void invoke6() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -262,7 +256,7 @@
    @Test
    public void invoke6a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -278,7 +272,7 @@
    @Test
    public void invoke7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -294,7 +288,7 @@
    @Test
    public void invokeAdmin1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -310,7 +304,7 @@
    @Test
    public void invokeAdmin2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -326,7 +320,7 @@
    @Test
    public void invokeAdmin3() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -342,7 +336,7 @@
    @Test
    public void invokeAdmin4() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet4");
+      PortletInvoker i = new PortletInvoker(ams, "portlet4");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -354,7 +348,7 @@
    @Test
    public void invokeAdmin5() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet5");
+      PortletInvoker i = new PortletInvoker(ams, "portlet5");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -366,7 +360,7 @@
    @Test
    public void invokeAdmin8() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet8");
+      PortletInvoker i = new PortletInvoker(ams, "portlet8");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
@@ -378,7 +372,7 @@
    @Test
    public void invokeAdmin7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.renderHeaders(req, resp);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeRenderTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeRenderTest.java
index ca91592..d5043f8 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeRenderTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeRenderTest.java
@@ -24,28 +24,26 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
-import org.apache.pluto.container.bean.processor.fixtures.render.Render1;
-import org.apache.pluto.container.bean.processor.fixtures.render.Render2;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockRenderRequest;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockRenderResponse;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.bean.processor.fixtures.render.Render1;
+import org.apache.pluto.container.bean.processor.fixtures.render.Render2;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for invoking the annotated render methods.
@@ -53,40 +51,36 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Render1.class)
 public class InvokeRenderTest {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private static final MockRenderRequest req = new MockRenderRequest();
    private static final MockRenderResponse resp = new MockRenderResponse();
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.render";
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
    
-   private static String DEFAULT_NS = "http://www.java.net/";
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
       
       assertNotNull(ams);
       assertNotNull(summary);
-      ams.setDefaultNamespace(DEFAULT_NS);
    }
    
    @Test
    public void invoke1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.render(req, resp);
@@ -106,7 +100,7 @@
    @Test
    public void invoke1a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.render(req, resp);
@@ -118,7 +112,7 @@
    @Test
    public void invoke1b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = new PortletMode("CustomMode");
       req.setMode(mode);
       i.render(req, resp);
@@ -130,7 +124,7 @@
    @Test
    public void invoke2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.render(req, resp);
@@ -142,7 +136,7 @@
    @Test
    public void invoke2a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.render(req, resp);
@@ -160,7 +154,7 @@
    @Test
    public void invoke2b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = new PortletMode("Config");
       req.setMode(mode);
       i.render(req, resp);
@@ -178,7 +172,7 @@
    @Test
    public void invoke2c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = PortletMode.EDIT;
       req.setMode(mode);
       i.render(req, resp);
@@ -196,7 +190,7 @@
    @Test
    public void invoke3a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.render(req, resp);
@@ -212,7 +206,7 @@
    @Test
    public void invoke3b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.render(req, resp);
@@ -230,7 +224,7 @@
    @Test
    public void invoke3c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = PortletMode.EDIT;
       req.setMode(mode);
       i.render(req, resp);
@@ -246,7 +240,7 @@
    @Test
    public void invoke6() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       PortletMode mode = PortletMode.VIEW;
       req.setMode(mode);
       i.render(req, resp);
@@ -262,7 +256,7 @@
    @Test
    public void invoke6a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.render(req, resp);
@@ -273,7 +267,7 @@
    @Test
    public void invoke7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       PortletMode mode = PortletMode.HELP;
       req.setMode(mode);
       i.render(req, resp);
@@ -285,7 +279,7 @@
    @Test
    public void invokeAdmin1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -301,7 +295,7 @@
    @Test
    public void invokeAdmin2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -317,7 +311,7 @@
    @Test
    public void invokeAdmin3() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -333,7 +327,7 @@
    @Test
    public void invokeAdmin4() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet4");
+      PortletInvoker i = new PortletInvoker(ams, "portlet4");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -345,7 +339,7 @@
    @Test
    public void invokeAdmin5() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet5");
+      PortletInvoker i = new PortletInvoker(ams, "portlet5");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -357,7 +351,7 @@
    @Test
    public void invokeAdmin8() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet8");
+      PortletInvoker i = new PortletInvoker(ams, "portlet8");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
@@ -369,7 +363,7 @@
    @Test
    public void invokeAdmin7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       PortletMode mode = new PortletMode("admin");
       req.setMode(mode);
       i.render(req, resp);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeResourceTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeResourceTest.java
index 4eb6a29..275fb7a 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeResourceTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/InvokeResourceTest.java
@@ -24,27 +24,25 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 
-import javax.inject.Inject;
-
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockResourceRequest;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockResourceResponse;
 import org.apache.pluto.container.bean.processor.fixtures.resource.Resource1;
 import org.apache.pluto.container.bean.processor.fixtures.resource.Resource2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for invoking the annotated resource methods.
@@ -52,40 +50,39 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Resource1.class)
 public class InvokeResourceTest {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private static final MockResourceRequest req = new MockResourceRequest();
    private static final MockResourceResponse resp = new MockResourceResponse();
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.resource";
    
-   private AnnotatedMethodStore ams = null;
-   private ConfigSummary summary = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   private static PortletApplicationDefinition pad = null;
    
-   private static String DEFAULT_NS = "http://www.java.net/";
-   
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      pad = holder.getPad();
       
       assertNotNull(ams);
       assertNotNull(summary);
-      ams.setDefaultNamespace(DEFAULT_NS);
+      assertNotNull(pad);
    }
    
    @Test
    public void invoke1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       String resid = "VIEW";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -105,7 +102,7 @@
    @Test
    public void invoke1a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       String resid = "HELP";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -125,7 +122,7 @@
    @Test
    public void invoke1b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       String resid = "CustomMode";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -145,7 +142,7 @@
    @Test
    public void invoke2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       String resid = "VIEW";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -157,7 +154,7 @@
    @Test
    public void invoke2a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       String resid = "help";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -175,7 +172,7 @@
    @Test
    public void invoke2b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       String resid = "config";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -193,7 +190,7 @@
    @Test
    public void invoke2c() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       String resid = "edit";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -211,7 +208,7 @@
    @Test
    public void invoke2d() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       // resource ID match is case-sensitive
       String resid = "eDit";
       req.setResourceId(resid);
@@ -224,7 +221,7 @@
    @Test
    public void invoke3a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       String resid = "help";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -240,7 +237,7 @@
    @Test
    public void invoke3b() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       String resid = "VIEW";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -258,7 +255,7 @@
    @Test
    public void invoke6() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       String resid = "VIEW";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -274,7 +271,7 @@
    @Test
    public void invoke6a() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet6");
+      PortletInvoker i = new PortletInvoker(ams, "portlet6");
       String resid = "HELP";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -290,7 +287,7 @@
    @Test
    public void invoke7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       String resid = "HELP";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -306,7 +303,7 @@
    @Test
    public void invokeAdmin1() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet1");
+      PortletInvoker i = new PortletInvoker(ams, "portlet1");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -322,7 +319,7 @@
    @Test
    public void invokeAdmin2() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet2");
+      PortletInvoker i = new PortletInvoker(ams, "portlet2");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -338,7 +335,7 @@
    @Test
    public void invokeAdmin3() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet3");
+      PortletInvoker i = new PortletInvoker(ams, "portlet3");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -354,7 +351,7 @@
    @Test
    public void invokeAdmin4() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet4");
+      PortletInvoker i = new PortletInvoker(ams, "portlet4");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -366,7 +363,7 @@
    @Test
    public void invokeAdmin5() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet5");
+      PortletInvoker i = new PortletInvoker(ams, "portlet5");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -378,7 +375,7 @@
    @Test
    public void invokeAdmin8() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet8");
+      PortletInvoker i = new PortletInvoker(ams, "portlet8");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
@@ -390,7 +387,7 @@
    @Test
    public void invokeAdmin7() throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, "portlet7");
+      PortletInvoker i = new PortletInvoker(ams, "portlet7");
       String resid = "admin";
       req.setResourceId(resid);
       i.serveResource(req, resp);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/RenderTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/RenderTest.java
index f085a1e..f9d264b 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/RenderTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/RenderTest.java
@@ -19,34 +19,31 @@
 package org.apache.pluto.container.bean.processor.tests;
 
 import static org.apache.pluto.container.bean.processor.MethodType.RENDER;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.fixtures.render.Render1;
 import org.apache.pluto.container.bean.processor.fixtures.render.Render2;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for RenderStateScoped beans
@@ -54,23 +51,23 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Render1.class)
 public class RenderTest {
-
-   @Inject
-   AnnotatedConfigBean          acb;
-
-   private AnnotatedMethodStore ams     = null;
-   private ConfigSummary        summary = null;
-
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
-
+   
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.render";
+   
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      
       assertNotNull(ams);
       assertNotNull(summary);
    }
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ResourceTest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ResourceTest.java
index 8ff1be4..d64eb41 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ResourceTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/ResourceTest.java
@@ -19,34 +19,34 @@
 package org.apache.pluto.container.bean.processor.tests;
 
 import static org.apache.pluto.container.bean.processor.MethodType.RESOURCE;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethod;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
 import org.apache.pluto.container.bean.processor.fixtures.resource.Resource1;
 import org.apache.pluto.container.bean.processor.fixtures.resource.Resource2;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.AdditionalPackages;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test class for RenderStateScoped beans
@@ -54,30 +54,27 @@
  * @author Scott Nicklous
  *
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses(PortletCDIExtension.class)
-@AdditionalPackages(Resource1.class)
 public class ResourceTest {
-
-   @Inject
-   AnnotatedConfigBean          acb;
-
-   private AnnotatedMethodStore ams     = null;
-   private ConfigSummary        summary = null;
-   private PortletApplicationDefinition pad = null;
-
-   @Before
-   public void setUp() {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      summary = acb.getSummary();
-
+   
+   private static final String pkg = "org.apache.pluto.container.bean.processor.fixtures.resource";
+   
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   private static PortletApplicationDefinition pad = null;
+   
+   @BeforeClass
+   public static void setUpClass() throws URISyntaxException, IOException {
+      Set<File> classes = FileHelper.getClasses(pkg);
+      holder.scanMethodAnnotations(classes);
+      holder.reconcileBeanConfig();
+      holder.instantiatePortlets(null);
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      pad = holder.getPad();
+      
       assertNotNull(ams);
       assertNotNull(summary);
-      
-      ConfigurationHolder ch = new ConfigurationHolder();
-      ch.reconcileBeanConfig(ams);
-      pad = ch.getPad();
       assertNotNull(pad);
    }
 
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/WeldInitializer.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/WeldInitializer.java
deleted file mode 100644
index ea544a3..0000000
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/tests/WeldInitializer.java
+++ /dev/null
@@ -1,42 +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.pluto.container.bean.processor.tests;
-
-import org.jboss.weld.environment.se.Weld;
-import org.jboss.weld.environment.se.WeldContainer;
-
-/**
- * Class that doesn't do much except for initializing weld.
- * 
- * @author Scott Nicklous
- *
- */
-public class WeldInitializer {
-
-   // for Weld container initialization
-   public static Weld weld;
-   public static WeldContainer beanContainer;
-   static {
-      weld = new Weld();
-      beanContainer = weld.initialize();
-      System.out.println("SUI: static initializer - initialized Weld");
-   }
-
-}
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/IncompletePortlet.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/IncompletePortlet.java
index 0ac031d..3ed119f 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/IncompletePortlet.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/IncompletePortlet.java
@@ -42,8 +42,7 @@
 @ApplicationScoped
 public class IncompletePortlet {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private PortletConfig config;
    
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1.java
index 41c9346..166c39c 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1.java
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -76,8 +75,7 @@
 })
 public class TestPortlet1 extends GenericPortlet {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
 
    @Override
    public void destroy() {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1a.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1a.java
index 3289ba1..d658100 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1a.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet1a.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.reconcile.fixtures;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -38,8 +37,7 @@
  */
 public class TestPortlet1a {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @ActionMethod(portletName="Portlet1", actionName="Fred", publishingEvents = {
          @PortletQName(namespaceURI="http://www.apache.org/", localPart="event2"),
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet2.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet2.java
index d569680..c40fb43 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet2.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet2.java
@@ -19,7 +19,6 @@
 
 package org.apache.pluto.container.reconcile.fixtures;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -58,8 +57,7 @@
 )
 public class TestPortlet2 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    @RenderMethod(portletNames="Portlet2")
    public String myView() {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet3.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet3.java
index a3a4acc..7a9cc8c 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet3.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet3.java
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.Portlet;
@@ -38,8 +37,7 @@
  */
 public class TestPortlet3 implements Portlet {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private PortletConfig config;
 
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet4.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet4.java
index 08f0c0c..deb8570 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet4.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet4.java
@@ -20,7 +20,6 @@
 package org.apache.pluto.container.reconcile.fixtures;
 
 import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -45,8 +44,7 @@
 @ApplicationScoped
 public class TestPortlet4 {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
    private PortletConfig config;
    
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet5.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet5.java
index 6877f72..234ef85 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet5.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet5.java
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -77,8 +76,7 @@
 })
 public class TestPortlet5 extends GenericPortlet {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
 
    @Override
    public void destroy() {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet6.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet6.java
index 5eed2bd..7ee18de 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet6.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/fixtures/TestPortlet6.java
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
@@ -56,8 +55,7 @@
 @PortletConfiguration(portletName="Portlet6")
 public class TestPortlet6 extends GenericPortlet {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
 
    @Override
    public void init() {
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/AnnotatedGenericPortletInvokeTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/AnnotatedGenericPortletInvokeTest.java
index fd60857..b618866 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/AnnotatedGenericPortletInvokeTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/AnnotatedGenericPortletInvokeTest.java
@@ -25,51 +25,32 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
-import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
-import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet5;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests that if a generic portlet event method is annotated to provide the processing
- * event reference QNames, the methods are part of te same portlet instance.
+ * event reference QNames, the methods are part of the same portlet instance.
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, InvokeHelper.class, TestPortlet5.class})
 public class AnnotatedGenericPortletInvokeTest {
    
-   @Inject
-   private InvocationResults meths;
-   
-   @Inject
-   private InvokeHelper helper;
-
+   private InvocationResults meths = InvocationResults.getInvocationResults();
+   private static InvokeHelper helper;
    private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet5.class;
-
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   // Classes under test
-   private AnnotatedMethodStore ams = null;
-   private PortletApplicationDefinition app;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
@@ -77,30 +58,28 @@
       Set<Class<?>> classes = new HashSet<Class<?>>();
       classes.add(TEST_ANNOTATED_CLASS1);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
       try {
-         ch.processConfigAnnotations(classes);
+         holder.processConfigAnnotations(classes);
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
+      
+      helper = new InvokeHelper(ams);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      assertNotNull(ams);
-      assertNotNull(helper);
-
-      app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
-      
       helper.init("Portlet5", null);
    }
   
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/GenericPortletFeaturesInvokeTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/GenericPortletFeaturesInvokeTest.java
index e211836..3be73eb 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/GenericPortletFeaturesInvokeTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/GenericPortletFeaturesInvokeTest.java
@@ -27,24 +27,17 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
-import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
-import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet6;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests that if a generic portlet event method is annotated to provide the processing
@@ -52,26 +45,14 @@
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, InvokeHelper.class, TestPortlet6.class})
 public class GenericPortletFeaturesInvokeTest {
    
-   @Inject
-   private InvocationResults meths;
-   
-   @Inject
-   private InvokeHelper helper;
-
+   private InvocationResults meths = InvocationResults.getInvocationResults();
+   private static InvokeHelper helper;
    private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet6.class;
-
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   // Classes under test
-   private AnnotatedMethodStore ams = null;
-   private PortletApplicationDefinition app;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
@@ -79,30 +60,28 @@
       Set<Class<?>> classes = new HashSet<Class<?>>();
       classes.add(TEST_ANNOTATED_CLASS1);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
       try {
-         ch.processConfigAnnotations(classes);
+         holder.processConfigAnnotations(classes);
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
+      
+      helper = new InvokeHelper(ams);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      assertNotNull(ams);
-      assertNotNull(helper);
-
-      app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
-      
       helper.init("Portlet6", null);
    }
   
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ImpliedPortletTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ImpliedPortletTest.java
index 7b525ad..fe4f83c 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ImpliedPortletTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ImpliedPortletTest.java
@@ -19,96 +19,83 @@
 
 package org.apache.pluto.container.reconcile.tests;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.EventDefinitionReference;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
 import org.apache.pluto.container.om.portlet.impl.EventDefinitionReferenceImpl;
-import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
-import org.apache.pluto.container.om.portlet.impl.jsr362.MergePortletAppTest;
-import org.apache.pluto.container.reconcile.fixtures.IncompletePortlet;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet2;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet3;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet4;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Adds a bean portlet that is defined implicitly through the portlet method annotations.
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, TestPortlet1.class, 
-   TestPortlet2.class, TestPortlet3.class, TestPortlet4.class, IncompletePortlet.class})
 public class ImpliedPortletTest {
 
    private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet1.class;
    private static final Class<?> TEST_ANNOTATED_CLASS2 = TestPortlet2.class;
    private static final String XML_FILE = 
          "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
+   
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
 
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   private AnnotatedMethodStore ams = null;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
 
    // Classes under test
-   private PortletApplicationDefinition app;
+   private static PortletApplicationDefinition app;
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
       
-      InputStream in = MergePortletAppTest.class
+      InputStream in = ImpliedPortletTest.class
             .getClassLoader().getResourceAsStream(XML_FILE);
 
-      Set<Class<?>> classes = new HashSet<Class<?>>();
-      classes.add(TEST_ANNOTATED_CLASS1);
-      classes.add(TEST_ANNOTATED_CLASS2);
+      Set<Class<?>> configClasses = new HashSet<Class<?>>();
+      configClasses.add(TEST_ANNOTATED_CLASS1);
+      configClasses.add(TEST_ANNOTATED_CLASS2);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
       try {
-         ch.processConfigAnnotations(classes);
-         ch.processPortletDD(in);     // process portlet xml after annotations
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.processConfigAnnotations(configClasses);
+         holder.processPortletDD(in);     // process portlet xml after annotations
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
-   }
-
-   @Before
-   public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      app = holder.getPad();
+      
       assertNotNull(ams);
-
-      app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
+      assertNotNull(summary);
    }
 
    // Begin portlet app tests ==================================
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/InvokeHelper.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/InvokeHelper.java
index fa77f54..9f0fc35 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/InvokeHelper.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/InvokeHelper.java
@@ -26,11 +26,10 @@
 
 import java.util.List;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
+import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
 import org.apache.pluto.container.bean.processor.fixtures.mocks.MockActionRequest;
@@ -53,11 +52,9 @@
  */
 public class InvokeHelper {
    
-   @Inject
-   private InvocationResults meths;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
    
-   @Inject
-   AnnotatedConfigBean acb;
+   private final AnnotatedMethodStore ams;
    
    private static MockPortletConfig config = new MockPortletConfig();
    
@@ -76,24 +73,27 @@
    private static MockResourceRequest  reqResource  = new MockResourceRequest();
    private static MockResourceResponse respResource = new MockResourceResponse();
 
+   public InvokeHelper(AnnotatedMethodStore ams) {
+      this.ams = ams;
+   }
    
    public void init(String portlet, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       i.init(config);
       checkName(methName);
    }
    
    public void destroy(String portlet, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       i.destroy();
       checkName(methName);
    }
    
    public void action(String portlet, String actName, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqAction.setActionName(actName);
       i.processAction(reqAction, respAction);
       checkName(methName);
@@ -101,7 +101,7 @@
    
    public void event(String portlet, QName qn, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqEvent.setQn(qn);
       i.processEvent(reqEvent, respEvent);
       checkName(methName);
@@ -109,7 +109,7 @@
    
    public void header(String portlet, PortletMode pm, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqHeader.setMode(pm);
       i.renderHeaders(reqHeader, respHeader);
       checkName(methName);
@@ -117,7 +117,7 @@
    
    public void render(String portlet, PortletMode pm, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqRender.setMode(pm);
       i.render(reqRender, respRender);
       checkName(methName);
@@ -126,7 +126,7 @@
    // used when a doHeaders call is expected (test portlet extends GenericPorlet)
    public void renderWithHeaders(String portlet, PortletMode pm, List<String> methNames) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqRender.setMode(pm);
       i.render(reqRender, respRender);
       List<String> names = meths.getMethods();
@@ -142,7 +142,7 @@
    
    public void resource(String portlet, String resid, String methName) throws Exception {
       meths.reset();
-      PortletInvoker i = new PortletInvoker(acb, portlet);
+      PortletInvoker i = new PortletInvoker(ams, portlet);
       reqResource.setResourceId(resid);
       i.serveResource(reqResource, respResource);
       checkName(methName);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/MergeEventDefsTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/MergeEventDefsTest.java
index 0808400..df6ad46 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/MergeEventDefsTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/MergeEventDefsTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashSet;
 import java.util.List;
@@ -30,13 +31,15 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.EventDefinitionReference;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
 import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
 import org.apache.pluto.container.om.portlet.impl.PortletDefinitionImpl;
-import org.apache.pluto.container.om.portlet.impl.jsr362.MergePortletAppTest;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet2;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet3;
@@ -56,6 +59,12 @@
    private static final Class<?> TEST_ANNOTATED_CLASS2 = TestPortlet2.class;
    private static final String XML_FILE = 
          "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
+   
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
+
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
 
    private static PortletApplicationDefinition pad, app;
 
@@ -66,31 +75,39 @@
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
       
-      InputStream in = MergePortletAppTest.class
+      InputStream in = MergeEventDefsTest.class
             .getClassLoader().getResourceAsStream(XML_FILE);
 
-      Set<Class<?>> classes = new HashSet<Class<?>>();
-      classes.add(TEST_ANNOTATED_CLASS1);
-      classes.add(TEST_ANNOTATED_CLASS2);
+      Set<Class<?>> configClasses = new HashSet<Class<?>>();
+      configClasses.add(TEST_ANNOTATED_CLASS1);
+      configClasses.add(TEST_ANNOTATED_CLASS2);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
       try {
-         ch.processConfigAnnotations(classes);
-         ch.processPortletDD(in);     // process portlet xml after annotations
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.processConfigAnnotations(configClasses);
+         holder.processPortletDD(in);     // process portlet xml after annotations
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      pad = holder.getPad();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertEquals(3, pad.getPortlets().size());
+      assertEquals(4, pad.getPortlets().size());
       assertNotNull(pad.getPortlet("Portlet1"));
       assertNotNull(pad.getPortlet("Portlet2"));
       assertNotNull(pad.getPortlet("Portlet3"));
@@ -140,14 +157,14 @@
    public void test1processingEvent() throws Exception {
       List<EventDefinitionReference> events = portlet1.getSupportedProcessingEvents();
       assertNotNull(events);
-      assertEquals(0, events.size());
+      assertEquals(2, events.size());
    }
    
    @Test
    public void test1publishingEvent() throws Exception {
       List<EventDefinitionReference> events = portlet1.getSupportedPublishingEvents();
       assertNotNull(events);
-      assertEquals(0, events.size());
+      assertEquals(3, events.size());
    }
   
    // Begin portlet 2 tests ================================== 
@@ -167,14 +184,14 @@
    public void test2processingEvent() throws Exception {
       List<EventDefinitionReference> events = portlet2.getSupportedProcessingEvents();
       assertNotNull(events);
-      assertEquals(0, events.size());
+      assertEquals(2, events.size());
    }
    
    @Test
    public void test2publishingEvent() throws Exception {
       List<EventDefinitionReference> events = portlet2.getSupportedPublishingEvents();
       assertNotNull(events);
-      assertEquals(0, events.size());
+      assertEquals(3, events.size());
    }
    
    // Begin portlet 3 tests ================================== 
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletInvokeTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletInvokeTest.java
index 96f0cfb..538c0c5 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletInvokeTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletInvokeTest.java
@@ -23,33 +23,27 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.portlet.PortletMode;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.fixtures.InvocationResults;
-import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
-import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
-import org.apache.pluto.container.om.portlet.impl.jsr362.MergePortletAppTest;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1a;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet2;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet3;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet4;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests that the expected portlet methods are present for a portlet app with several
@@ -57,66 +51,58 @@
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, InvokeHelper.class, TestPortlet1.class, TestPortlet1a.class, 
-   TestPortlet2.class, TestPortlet3.class, TestPortlet4.class})
 public class PortletInvokeTest {
    
-   @Inject
-   private InvocationResults meths;
-   
-   @Inject
-   private InvokeHelper helper;
+   private InvocationResults meths = InvocationResults.getInvocationResults();
+   private static InvokeHelper helper;
 
    private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet1.class;
    private static final Class<?> TEST_ANNOTATED_CLASS2 = TestPortlet2.class;
    private static final String XML_FILE = 
          "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
 
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   // Classes under test
-   private AnnotatedMethodStore ams = null;
-   private PortletApplicationDefinition app;
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
+
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
       
-      InputStream in = MergePortletAppTest.class
+      InputStream in = PortletInvokeTest.class
             .getClassLoader().getResourceAsStream(XML_FILE);
 
-      Set<Class<?>> classes = new HashSet<Class<?>>();
-      classes.add(TEST_ANNOTATED_CLASS1);
-      classes.add(TEST_ANNOTATED_CLASS2);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
+      Set<Class<?>> configClasses = new HashSet<Class<?>>();
+      configClasses.add(TEST_ANNOTATED_CLASS1);
+      configClasses.add(TEST_ANNOTATED_CLASS2);
+
       try {
-         ch.processConfigAnnotations(classes);
-         ch.processPortletDD(in);     // process portlet xml after annotations
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.processConfigAnnotations(configClasses);
+         holder.processPortletDD(in);     // process portlet xml after annotations
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
+      
+      helper = new InvokeHelper(ams);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      assertNotNull(ams);
-      assertNotNull(helper);
-
-      app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
-      
       helper.init("Portlet1", null);
       helper.init("Portlet2", null);
       helper.init("Portlet3", null);
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletMethodTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletMethodTest.java
index e4e7b66..550ba6b 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletMethodTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/PortletMethodTest.java
@@ -23,33 +23,24 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
 import org.apache.pluto.container.bean.processor.MethodIdentifier;
 import org.apache.pluto.container.bean.processor.MethodType;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
-import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
-import org.apache.pluto.container.om.portlet.impl.jsr362.MergePortletAppTest;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet1a;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet2;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet3;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet4;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
-import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests that the expected portlet methods are present for a portlet app with several
@@ -57,9 +48,6 @@
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, TestPortlet1.class, TestPortlet1a.class, 
-   TestPortlet2.class, TestPortlet3.class, TestPortlet4.class})
 public class PortletMethodTest {
 
    private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet1.class;
@@ -67,48 +55,46 @@
    private static final String XML_FILE = 
          "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
 
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
+
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+
    // Classes under test
-   private AnnotatedMethodStore ams = null;
-   private PortletApplicationDefinition app;
+   private static PortletApplicationDefinition app;
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
       
-      InputStream in = MergePortletAppTest.class
+      InputStream in = PortletInvokeTest.class
             .getClassLoader().getResourceAsStream(XML_FILE);
 
-      Set<Class<?>> classes = new HashSet<Class<?>>();
-      classes.add(TEST_ANNOTATED_CLASS1);
-      classes.add(TEST_ANNOTATED_CLASS2);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
+      Set<Class<?>> configClasses = new HashSet<Class<?>>();
+      configClasses.add(TEST_ANNOTATED_CLASS1);
+      configClasses.add(TEST_ANNOTATED_CLASS2);
+
       try {
-         ch.processConfigAnnotations(classes);
-         ch.processPortletDD(in);     // process portlet xml after annotations
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.processConfigAnnotations(configClasses);
+         holder.processPortletDD(in);     // process portlet xml after annotations
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
-   }
-
-   @Before
-   public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      app = holder.getPad();
+      
       assertNotNull(ams);
-
-      app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
+      assertNotNull(summary);
    }
 
    // Begin portlet app tests ==================================
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ReconcileAnnotatedTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ReconcileAnnotatedTest.java
index cc6755a..67539f1 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ReconcileAnnotatedTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/ReconcileAnnotatedTest.java
@@ -24,17 +24,17 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.inject.Inject;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.EventDefinitionReference;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
@@ -42,17 +42,12 @@
 import org.apache.pluto.container.om.portlet.impl.EventDefinitionReferenceImpl;
 import org.apache.pluto.container.om.portlet.impl.PortletApplicationDefinitionImpl;
 import org.apache.pluto.container.om.portlet.impl.PortletDefinitionImpl;
-import org.apache.pluto.container.om.portlet.impl.jsr362.MergePortletAppTest;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet1;
-import org.apache.pluto.container.reconcile.fixtures.TestPortlet1a;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet2;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet3;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Reconciles a bean portlet configuration with a portlet app definition
@@ -60,64 +55,65 @@
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, TestPortlet1.class, 
-   TestPortlet2.class, TestPortlet3.class, TestPortlet1a.class})
 public class ReconcileAnnotatedTest {
 
-   private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet1.class;
-   private static final Class<?> TEST_ANNOTATED_CLASS2 = TestPortlet2.class;
-   private static final String XML_FILE = 
-         "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
-
-   private static PortletApplicationDefinition pad;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
-   private AnnotatedMethodStore ams = null;
-
    // Classes under test
    private PortletApplicationDefinition app;
    private PortletDefinition portlet1;
    private PortletDefinition portlet2;
    private PortletDefinition portlet3;
 
+   private static final Class<?> TEST_ANNOTATED_CLASS1 = TestPortlet1.class;
+   private static final Class<?> TEST_ANNOTATED_CLASS2 = TestPortlet2.class;
+   private static final String XML_FILE = 
+         "org/apache/pluto/container/om/portlet/portlet362Reconcile.xml";
+
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
+
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+   private static PortletApplicationDefinition pad;
+
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
       
-      InputStream in = MergePortletAppTest.class
+      InputStream in = ReconcileAnnotatedTest.class
             .getClassLoader().getResourceAsStream(XML_FILE);
 
-      Set<Class<?>> classes = new HashSet<Class<?>>();
-      classes.add(TEST_ANNOTATED_CLASS1);
-      classes.add(TEST_ANNOTATED_CLASS2);
 
-      ConfigurationHolder ch = new ConfigurationHolder();
+      Set<Class<?>> configClasses = new HashSet<Class<?>>();
+      configClasses.add(TEST_ANNOTATED_CLASS1);
+      configClasses.add(TEST_ANNOTATED_CLASS2);
+
       try {
-         ch.processConfigAnnotations(classes);
-         ch.processPortletDD(in);     // process portlet xml after annotations
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.processConfigAnnotations(configClasses);
+         holder.processPortletDD(in);     // process portlet xml after annotations
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
          try {
-            ch.validate();         // validate and ignore any validation problems.
+            holder.validate();         // validate and ignore any validation problems.
          } catch (Exception e) {}   
-         pad = ch.getPad();
       } catch (Exception e) {
          e.printStackTrace();
          throw e;
       }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      pad = holder.getPad();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      assertNotNull(ams);
 
       app = new PortletApplicationDefinitionImpl(pad);
-      ConfigurationHolder coho = new ConfigurationHolder(app);
-      coho.reconcileBeanConfig(ams);
 
-      assertEquals(3, app.getPortlets().size());
+      assertEquals(4, app.getPortlets().size());
       assertNotNull(app.getPortlet("Portlet1"));
       assertNotNull(app.getPortlet("Portlet2"));
       assertNotNull(app.getPortlet("Portlet3"));
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/StandAloneBeanPortletInvokeTest.java b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/StandAloneBeanPortletInvokeTest.java
index 61b79f5..496589d 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/StandAloneBeanPortletInvokeTest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/reconcile/tests/StandAloneBeanPortletInvokeTest.java
@@ -22,21 +22,21 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import javax.inject.Inject;
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.portlet.PortletMode;
 
-import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
 import org.apache.pluto.container.bean.processor.AnnotatedMethodStore;
-import org.apache.pluto.container.bean.processor.PortletCDIExtension;
+import org.apache.pluto.container.bean.processor.ConfigSummary;
+import org.apache.pluto.container.bean.processor.tests.FileHelper;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.impl.ConfigurationHolder;
 import org.apache.pluto.container.reconcile.fixtures.TestPortlet4;
-import org.jglue.cdiunit.AdditionalClasses;
-import org.jglue.cdiunit.CdiRunner;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests that a bean portlet without accompanying configuration data can
@@ -44,35 +44,54 @@
  * 
  * @author Scott Nicklous
  */
-@RunWith(CdiRunner.class)
-@AdditionalClasses({PortletCDIExtension.class, InvokeHelper.class, TestPortlet4.class})
 public class StandAloneBeanPortletInvokeTest {
    
-   @Inject
-   private InvokeHelper helper;
-   
-   @Inject
-   AnnotatedConfigBean acb;
-   
+   private static final String pkg = "org.apache.pluto.container.reconcile.fixtures";
+
+   private static InvokeHelper helper;
+   private static AnnotatedMethodStore ams = null;
+   private static ConfigSummary summary = null;
+   private static ConfigurationHolder holder =  new ConfigurationHolder();
+
    // Classes under test
-   private AnnotatedMethodStore ams = null;
-   private PortletApplicationDefinition app;
+   private static PortletApplicationDefinition app;
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
+      Set<File> portletMethodClasses = FileHelper.getClasses(pkg);
+      
+      // remve all files but the portlet 4 class
+      Set<File> delFiles = new HashSet<File>();
+      for (File file : portletMethodClasses) {
+         if (!file.getAbsolutePath().contains("Portlet4")) {
+            delFiles.add(file);
+         }
+      }
+      portletMethodClasses.removeAll(delFiles);
+
+      try {
+         holder.scanMethodAnnotations(portletMethodClasses);
+         holder.reconcileBeanConfig();
+         holder.instantiatePortlets(null);
+         try {
+            holder.validate();         // validate and ignore any validation problems.
+         } catch (Exception e) {}   
+      } catch (Exception e) {
+         e.printStackTrace();
+         throw e;
+      }
+      ams = holder.getMethodStore();
+      summary = holder.getConfigSummary();
+      app = holder.getPad();
+      
+      assertNotNull(ams);
+      assertNotNull(summary);
+      
+      helper = new InvokeHelper(ams);
    }
 
    @Before
    public void setUpBefore() throws Exception {
-      assertNotNull(acb);
-      ams = acb.getMethodStore();
-      assertNotNull(ams);
-      assertNotNull(helper);
-
-      ConfigurationHolder coho = new ConfigurationHolder();
-      coho.reconcileBeanConfig(ams);
-      app = coho.getPad();
-      
       helper.init("Portlet4", null);
    }
   
diff --git a/pom.xml b/pom.xml
index a88776f..18b068f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -280,6 +280,7 @@
     <jmock.version>1.2.0</jmock.version>
     <xmlunit.version>1.1</xmlunit.version>
     <cdi.version>2.3.1.Final</cdi.version>
+    <annotation-detector.version>3.0.5</annotation-detector.version>
 
     <!-- The following properties are not directly used as maven
 dependencies, they're used by the maven pluto plugin for
@@ -369,6 +370,13 @@
           <version>${cdi.version}</version>
       </dependency>      
 
+      <!-- For method annotation scanning ==================================== -->
+      <dependency>
+         <groupId>eu.infomas</groupId>
+         <artifactId>annotation-detector</artifactId>
+         <version>${annotation-detector.version}</version>
+      </dependency>
+
       <!--  CCPP Libraries -->
       <dependency>
         <groupId>javax.ccpp</groupId>
