diff --git a/api/pom.xml b/api/pom.xml
index 98bc320..242820a 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -348,7 +348,6 @@
                                     javax.servlet.jsp.jstl.core;version="[1.1.2, 2.0.0)",
                                     javax.servlet.jsp.jstl.sql;version="[1.1.2, 2.0.0)",
                                     javax.servlet.jsp.tagext;version="[2.1.0, 3.2)",
-                                    org.apache.commons.logging;version="[1.1.1, 2.0.0)",
                                     javax.faces.*;version="${project.version}"
                                 </Import-Package>
                                 <Require-Bundle>
diff --git a/bundle/pom.xml b/bundle/pom.xml
index 3e13584..a8d83c1 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -84,8 +84,6 @@
                             javax.validation.*;version="[1.0.0, 2.0.0)";resolution:=optional,
                             javax.xml.parsers,
                             org.apache;resolution:=optional,
-                            org.apache.commons.beanutils;version="[1.8.3, 2.0.0)",
-                            org.apache.commons.logging;version="[1.1.1, 2.0.0)",
                             org.w3c.dom,
                             org.xml.sax,
                             org.xml.sax.helpers,
diff --git a/impl/pom.xml b/impl/pom.xml
index 402227a..7d30a86 100644
--- a/impl/pom.xml
+++ b/impl/pom.xml
@@ -693,8 +693,6 @@
                                     javax.servlet.annotation;version="[3, 5)";resolution:=optional,
                                     javax.xml.parsers,
                                     org.apache;resolution:=optional,
-                                    org.apache.commons.beanutils;version="[1.8.3, 2.0.0)",
-                                    org.apache.commons.logging;version="[1.1.1, 2.0.0)",
                                     org.w3c.dom,
                                     org.xml.sax,
                                     org.xml.sax.helpers,
@@ -1055,12 +1053,6 @@
             <artifactId>myfaces-builder-annotations</artifactId>
         </dependency>
 
-        <!-- Commons -->
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-        </dependency>
-
         <!-- tomcat 7 support (InjectionProvider) -->
         <dependency>
             <groupId>org.apache.tomcat</groupId>
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index e1d2955..64cd411 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -20,6 +20,9 @@
 
 import java.beans.BeanDescriptor;
 import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -31,6 +34,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.MissingResourceException;
+import java.util.Objects;
 import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -90,7 +94,6 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import org.apache.commons.beanutils.BeanUtils;
 import org.apache.myfaces.cdi.wrapper.FacesBehaviorCDIWrapper;
 import org.apache.myfaces.cdi.wrapper.FacesClientBehaviorCDIWrapper;
 import org.apache.myfaces.cdi.wrapper.FacesConverterCDIWrapper;
@@ -1653,6 +1656,9 @@
 
     }
 
+    private Map<Class<?>, Map<String, PropertyDescriptor>> converterPDCache
+            = new ConcurrentHashMap<>();
+            
     private void setConverterProperties(final Class<?> converterClass, final Converter converter)
     {
         final org.apache.myfaces.config.element.Converter converterConfig = _runtimeConfig
@@ -1666,13 +1672,40 @@
 
         if (converterConfig != null && !converterConfig.getProperties().isEmpty())
         {
+            Map<String, PropertyDescriptor> pds = converterPDCache.computeIfAbsent(converterClass, c ->
+            {
+                HashMap<String, PropertyDescriptor> map = new HashMap<>(converterConfig.getProperties().size());
+                try
+                {
+                    for (PropertyDescriptor pd : Introspector.getBeanInfo(c).getPropertyDescriptors())
+                    {
+                        for (Property property : converterConfig.getProperties())
+                        {
+                            if (Objects.equals(pd.getName(), property.getPropertyName()))
+                            {
+                                map.put(property.getPropertyName(), pd);
+                            }
+                        }
+                    }
+                }
+                catch (IntrospectionException e)
+                {
+                    log.log(Level.SEVERE,
+                            "Could not read properties for setting default values of converter: "
+                                    + converterClass.getSimpleName(),
+                            e);
+                }
+                return map;
+            });
+
             for (int i = 0; i < converterConfig.getProperties().size(); i++)
             {
                 Property property = converterConfig.getProperties().get(i);
-                
                 try
                 {
-                    BeanUtils.setProperty(converter, property.getPropertyName(), property.getDefaultValue());
+                    PropertyDescriptor pd = pds.get(property.getPropertyName());
+                    Object convertedValue = ClassUtils.convertToType(property.getDefaultValue(), pd.getPropertyType());
+                    pd.getWriteMethod().invoke(converter, convertedValue);
                 }
                 catch (Throwable th)
                 {
diff --git a/impl/src/test/java/javax/faces/component/AbstractUIComponentPropertyTest.java b/impl/src/test/java/javax/faces/component/AbstractUIComponentPropertyTest.java
index 1983478..b348ea0 100644
--- a/impl/src/test/java/javax/faces/component/AbstractUIComponentPropertyTest.java
+++ b/impl/src/test/java/javax/faces/component/AbstractUIComponentPropertyTest.java
@@ -18,15 +18,16 @@
  */
 package javax.faces.component;
 
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 
 import javax.el.ELContext;
 import javax.el.ValueExpression;
 
-import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.myfaces.test.mock.MockFacesContext;
-import org.apache.myfaces.test.mock.MockFacesContext12;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 import org.junit.After;
@@ -81,10 +82,24 @@
 
     protected abstract UIComponent createComponent();
 
+    protected PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String property) throws IntrospectionException
+    {
+        for (PropertyDescriptor pd : Introspector.getBeanInfo(clazz).getPropertyDescriptors())
+        {
+            if (pd.getName().equals(property))
+            {
+                return pd;
+            }
+        }
+        return null;
+    }
+    
     @Test
     public void testDefaultValue() throws Exception
     {
-        Assert.assertEquals(_defaultValue, PropertyUtils.getProperty(_component, _property));
+        Object val = getPropertyDescriptor(_component.getClass(), _property).getReadMethod()
+                .invoke(_component);
+        Assert.assertEquals(_defaultValue, val);
     }
 
     @Test
@@ -92,8 +107,12 @@
     {
         for (T testValue : _testValues)
         {
-            PropertyUtils.setProperty(_component, _property, testValue);
-            Assert.assertEquals(testValue, PropertyUtils.getProperty(_component, _property));
+            getPropertyDescriptor(_component.getClass(), _property).getWriteMethod()
+                    .invoke(_component, testValue);
+            
+            Object val = getPropertyDescriptor(_component.getClass(), _property).getReadMethod()
+                    .invoke(_component);
+            Assert.assertEquals(testValue, val);
         }
     }
 
@@ -106,7 +125,10 @@
             expect(_valueExpression.getValue(eq(_facesContext.getELContext()))).andReturn(testValue);
             _mocksControl.replay();
             _component.setValueExpression(_property, _valueExpression);
-            Assert.assertEquals(testValue, PropertyUtils.getProperty(_component, _property));
+            
+            Object val = getPropertyDescriptor(_component.getClass(), _property).getReadMethod()
+                    .invoke(_component);
+            Assert.assertEquals(testValue, val);
             _mocksControl.reset();
         }
     }
@@ -122,7 +144,10 @@
             _mocksControl.reset();
             expect(_valueExpression.getValue(eq(_facesContext.getELContext()))).andReturn(testValue);
             _mocksControl.replay();
-            Assert.assertEquals(testValue, PropertyUtils.getProperty(_component, _property));
+            
+            Object val = getPropertyDescriptor(_component.getClass(), _property).getReadMethod()
+                    .invoke(_component);
+            Assert.assertEquals(testValue, val);
             _mocksControl.reset();
         }
     }
diff --git a/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java b/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java
index bc56e5c..e2b51f2 100644
--- a/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java
+++ b/impl/src/test/java/org/apache/myfaces/renderkit/html/behavior/AbstractClientBehaviorTestCase.java
@@ -22,13 +22,11 @@
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIViewRoot;
 import javax.faces.component.behavior.AjaxBehavior;
-import javax.faces.component.behavior.ClientBehaviorContext;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.ResponseWriter;
 
 import org.apache.myfaces.renderkit.html.HtmlResponseWriterImpl;
 import org.apache.myfaces.util.lang.FastWriter;
-import org.apache.myfaces.test.config.ConfigParser;
 import org.apache.myfaces.view.facelets.FaceletTestCase;
 import org.junit.Assert;
 import org.junit.Test;
@@ -41,7 +39,6 @@
 {
     protected ResponseWriter writer;
     protected FastWriter outputWriter; 
-    protected ConfigParser parser;
 
     protected abstract HtmlRenderedClientEventAttr[] getClientBehaviorHtmlRenderedAttributes();
     
@@ -82,8 +79,7 @@
     protected void setUpRenderKit() throws Exception
     {
         super.setUpRenderKit();
-        parser = new ConfigParser();
-        parser.parse(parser.getPlatformURLs());
+
         //parser.parse(this.getClass().getResource("/META-INF/faces-config.xml"));    
         request.setServletPath("/test");
     }
diff --git a/parent/pom.xml b/parent/pom.xml
index d027da1..4deac99 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -416,14 +416,6 @@
                 <scope>provided</scope>
             </dependency>
 
-            <dependency>
-                <groupId>commons-beanutils</groupId>
-                <artifactId>commons-beanutils</artifactId>
-                <version>1.9.4</version>
-                <scope>compile</scope>
-            </dependency>
-
-
             <!-- tomcat 7 support (InjectionProvider) -->
             <dependency>
                 <groupId>org.apache.tomcat</groupId>
diff --git a/parent/src/site/apt/googleappenginesupport.apt b/parent/src/site/apt/googleappenginesupport.apt
deleted file mode 100644
index 538eb48..0000000
--- a/parent/src/site/apt/googleappenginesupport.apt
+++ /dev/null
@@ -1,150 +0,0 @@
- ------
- Myfaces Core 2.0 on Google App Engine
- ------
- Ali Ok
- ------
- 2010-04-08
- ------- 
- 
-~~ 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.
-
-~~ NOTE: For help with the syntax of this file, see:
-~~ http://maven.apache.org/doxia/references/apt-format.html
-
-Myfaces Core 2.0 on Google App Engine
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  In order to run Myfaces on Google App Engine, you need to complete the steps below. Configuration explained in this document is tested with
-  Google App Engine 1.3.0.
-  
-  You can also find tutorials for {{{http://myfaces.apache.org/core20/myfaces2-googleappengine-eclipse-tutorial.html}Eclipse}} and {{{http://myfaces.apache.org/core20/myfaces2-googleappengine-idea-tutorial.html}IntelliJ IDEA}}.  
-
-   * Download a Myfaces Core <<<2.0.0-beta-3>>> or a version released <<later>> than <<<2.0.0-beta-3>>>. Google App Engine support is not available for older versions.
-     Extract and put following files into war/WEB-INF/lib:
-       
-       * myfaces-api-2.0.x.jar
-       
-       * myfaces-impl-2.0.x.jar
-       
-       * commons-beanutils-1.x.x.jar
-       
-       * commons-collections-3.x.jar
-       
-       * commons-digester-x.x.jar
-       
-       * commons-discovery-0.x.jar
-       
-       * commons-logging-1.x.x.jar
-        
-
-   * Add following lines into your web.xml.
-
-+------------------------------------------------------------------------+
-      <web-app>
-        ...
-        
-        <!--
-            Need to set a secret to avoid javax.crypto.BadPaddingException.
-            "param-value" must be Base64 encoded.
-            More details: http://wiki.apache.org/myfaces/Secure_Your_Application
-         -->
-        <context-param>
-            <param-name>org.apache.myfaces.SECRET</param-name>
-            <param-value>NzY1NDMyMTA=</param-value>
-        </context-param>
-        
-        <!--
-           Facelets configuration fragment
-        -->
-        <context-param>
-          <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-          <param-value>.xhtml</param-value>
-        </context-param>
-        
-        <servlet>
-          <servlet-name>Faces Servlet</servlet-name>
-          <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-        </servlet>
-        
-        <servlet-mapping>
-          <servlet-name>Faces Servlet</servlet-name>
-          <url-pattern>*.jsf</url-pattern>
-        </servlet-mapping>
-        ...      
-      </web-app>
-+------------------------------------------------------------------------+
-
-   * Enable sessions on App Engine. To do this, add line below to war/WEB-INF/appengine-web.xml.
-   
-+------------------------------------------------------------------------+
-      <sessions-enabled>true</sessions-enabled>
-+------------------------------------------------------------------------+
-
-   
-   * Although Google App Engine is said to support JSP 2.1, JSP implementation version(2.0) 
-     does not match JSP API version(2.1). So, we need to supply Unified Expression Language 
-     implementation jars. You can find them {{{https://uel.dev.java.net/}here}}.
-     Put el-api-1.x.jar and el-impl-1.x.jar into war/WEB-INF/lib.  
-
-   * If you have a faces-config.xml, please check that you use the header for JSF2:
-
-+------------------------------------------------------------------------+
-	<?xml version="1.0" encoding="UTF-8"?>
-	<faces-config
-	    xmlns="http://java.sun.com/xml/ns/javaee"
-	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
-	    version="2.0">
-	    ...
-	</faces-config>
-+------------------------------------------------------------------------+
-
-
-   * Here is the <<sample>> directory structure:
-   
-+------------------------------------------------------------------------+
-   +<Your Google App Engine Project Folder>
-     + src
-       + META-INF
-         - jdoconfig.xml
-     + war
-       - somepage.xhtml
-       + WEB-INF
-         - appengine-web.xml
-         - faces-config.xml
-         - logging.properties
-         - web.xml
-         + lib
-           - appengine-api-1.0-sdk-1.3.0.jar
-           - appengine-api-labs-1.3.0.jar
-           - commons-beanutils-1.7.0.jar
-           - commons-collections-3.2.jar
-           - commons-digester-1.8.jar
-           - commons-discovery-0.4.jar
-           - commons-logging-1.1.1.jar
-           - datanucleus-appengine-1.0.4.1.final.jar
-           - datanucleus-core-1.1.5.jar
-           - datanucleus-jpa-1.1.5.jar
-           - el-api-1.1.jar
-           - el-impl-1.1.jar
-           - geronimo-jpa_3.0_spec-1.1.1.jar
-           - geronimo-jta_1.1_spec-1.1.1.jar
-           - jdo2-api-2.3-eb.jar
-           - myfaces-api-2.0.0-beta-3.jar 
-           - myfaces-impl-2.0.0-beta-3.jar 
-+------------------------------------------------------------------------+
diff --git a/parent/src/site/apt/myfaces2-googleappengine-eclipse-tutorial.apt b/parent/src/site/apt/myfaces2-googleappengine-eclipse-tutorial.apt
deleted file mode 100644
index 6c6f904..0000000
--- a/parent/src/site/apt/myfaces2-googleappengine-eclipse-tutorial.apt
+++ /dev/null
@@ -1,202 +0,0 @@
- ------
- Tutorial : Configuring MyFaces 2 to run on Google App Engine with Eclipse
- ------
- Ali Ok
- ------
- 2010-04-08
- -------
- 
-~~ 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.
-
-~~ NOTE: For help with the syntax of this file, see:
-~~ http://maven.apache.org/doxia/references/apt-format.html
- 
-
-Tutorial : Configuring MyFaces 2 to run on Google App Engine with Eclipse
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  Google App Engine support for MyFaces 2 made trunk and it is released with MyFaces Core 2.0.0-beta-3. 
-  In this tutorial, I will explain how to use it. I assume that you have basic Eclipse, JSF and Facelets knowledge.
-
-  You can find IDE-independent instructions {{{./googleappenginesupport.html}here}}. Additionally, there is a tutorial for IntelliJ IDEA {{{./myfaces2-googleappengine-idea-tutorial.html}here}}.
-
-  {{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2.zip?attredirects=0&d=1}Here}} 
-  is the complete source code and the Eclipse project of the example application (which I took from 
-  {{{https://facelets.dev.java.net/nonav/docs/dev/docbook.html}Facelets Tutorial}}) that I configured to run on 
-  Google App Engine. 
-  
-  I deployed the application explained in this tutorial to: 
-  {{{http://myfaces2-tutorial.latest.aliok-com-tr-test.appspot.com/guess.jsf}http://myfaces2-tutorial.latest.aliok-com-tr-test.appspot.com/guess.jsf}} 
-
-  In order to run Myfaces on Google App Engine, you need to complete the steps below. Configuration explained in this document is tested with
-  Google App Engine 1.3.2.
-
-*Table of Content
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
-%{toc|section=2|fromDepth=1|toDepth=1}
-
-
-
-*{Setting up the environment}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  
-  [[1]]  Download Eclipse {{{http://www.eclipse.org/downloads/}here}}, preferably IDE for JEE Developers.
-  
-  [[2]]  Install Google Eclipse Plugin with {{{http://code.google.com/eclipse/docs/download.html}this}} guide.
-
-
-
-
-*{Creating the Project and Placing the Jars}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  
-  [[1]] Create a Web Application Project (uncheck "Use Google Web Toolkit" if you won't use GWT)
-  
-[images/gaetutorial-eclipse/01.jpg] Creating the Project
-  
-[images/gaetutorial-eclipse/02.jpg] Creating the Project
-  
-  [[2]] Download Myfaces Core {{{http://myfaces.apache.org/download.html}here}}. We need "MyFaces Core 2.0.0-beta-3" or a 
-        later version. Extract files below and put them into war/WEB-INF/lib.
-    
-      * lib/myfaces-api-2.x.x.jar
-      
-      * lib/myfaces-impl-2.x.x.jar
-      
-      * lib/commons-logging-1.x.x.jar
-      
-      * lib/commons-beanutils-1.x.x.jar
-      
-      * lib/commons-collections-3.x.jar
-      
-      * lib/commons-digester-x.x.jar (I tested with version 1.8)
-      
-      * lib/commons-discovery-0.x.jar
-
-      Here is the war/WEB-INF/lib so far:
-      
-[images/gaetutorial-eclipse/03.jpg] war/WEB-INF/lib
-         
-      Please note that some jars (i.e. jdo2-api-2.3-eb.jar) are put by Google App Engine Eclipse plugin when the project is created.
-        
-
-  [[3]]  Download {{{http://download.java.net/maven/glassfish/javax/el/el-api/1.1/el-api-1.1.jar}el-api}}  
-         and {{{http://download.java.net/maven/glassfish/org/glassfish/web/el-impl/1.1/el-impl-1.1.jar}el-impl}} 
-         and put them into war/WEB-INF/lib. You can see the war/WEB-INF/lib so far below.
-
-[images/gaetutorial-eclipse/04.jpg] war/WEB-INF/lib
-
-  [[4]]  Add lines below into war/WEB-INF/web.xml.
-
-+------------------------------------------------------------------------+
-     <web-app ...
-             ...
-            <!--
-                Need to set a secret to avoid javax.crypto.BadPaddingException.
-                "param-value" must be Base64 encoded.
-                More details: http://wiki.apache.org/myfaces/Secure_Your_Application
-             -->
-            <context-param>
-                <param-name>org.apache.myfaces.SECRET</param-name>
-                <param-value>NzY1NDMyMTA=</param-value>
-                </context-param>       
-
-            <!--
-               Facelets configuration fragment
-            -->
-            <context-param>
-              <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-              <param-value>.xhtml</param-value>
-            </context-param>
-           
-            <servlet>
-              <servlet-name>Faces Servlet</servlet-name>
-              <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-            </servlet>
-           
-            <servlet-mapping>
-              <servlet-name>Faces Servlet</servlet-name>
-              <url-pattern>*.jsf</url-pattern>
-            </servlet-mapping>
-           ...     
-    </web-app>
-+------------------------------------------------------------------------+
-
-  
-  
-  [[5]] Make sure that you use the JSF 2 header in your faces-config.
-
-+------------------------------------------------------------------------+
-<?xml version="1.0"  encoding="UTF-8"?>
-
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
-version="2.0">
-     ...
-</faces-config>
-+------------------------------------------------------------------------+
-
-
-
-  [[6]] Add the following line into war/WEB-INF/appengine-web.xml:
-
-+------------------------------------------------------------------------+
-      <sessions-enabled>true</sessions-enabled>
-+------------------------------------------------------------------------+
-
-
-  
-  [[7]]  Now you can add your stuff (pages, beans, etc.). You cannot use JSP as view technology on Google App Engine. 
-         You must use Facelets, which is the default view technology in JSF 2.
-         
-
-
-
-
-
-*{Deploying to App Engine Development Server (Your Local Server)}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  Right click on the project and select "Run As -> Web Application". This will start 
-  Google App Engine development server. You can see the port information on the console (default is 8888).
-  
-[images/gaetutorial-eclipse/05.jpg] Deployment to Local Development Server
-  
-
-
-
-
-*{Deploying to Google App Engine}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  [[1]]  Right-click on the project and select "Properties".
-  
-  [[2]]  Select "Google"->"App Engine".
-  
-  [[3]]  Select "Use Google App Engine" if not selected, and type your "Application ID". Press OK and close the dialog.
-  
-[images/gaetutorial-eclipse/06.jpg] Configuring the Google App Engine Project
-  
-  [[4]]  Right click on the project and select "Google" -> "Deploy to App Engine"
-    
-  [[5]]  Enter your account information, and the application will be deployed on your-app-id.appspot.com.
-
-[images/gaetutorial-eclipse/07.jpg] Deployment to Google App Engine
-
-  [[6]]  The URL for the application I deployed is : 
-         {{{http://myfaces2-tutorial.latest.aliok-com-tr-test.appspot.com/guess.jsf}http://myfaces2-tutorial.latest.aliok-com-tr-test.appspot.com/guess.jsf}}
diff --git a/parent/src/site/apt/myfaces2-googleappengine-idea-tutorial.apt b/parent/src/site/apt/myfaces2-googleappengine-idea-tutorial.apt
deleted file mode 100644
index 73d4192..0000000
--- a/parent/src/site/apt/myfaces2-googleappengine-idea-tutorial.apt
+++ /dev/null
@@ -1,382 +0,0 @@
- ------
- Tutorial : Configuring MyFaces 2 to run on Google App Engine with IntelliJ IDEA
- ------
- Ali Ok
- ------
- 2010-04-08
- ------- 
- 
-~~ 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.
-
-~~ NOTE: For help with the syntax of this file, see:
-~~ http://maven.apache.org/doxia/references/apt-format.html
- 
-
-Tutorial : Configuring MyFaces 2 to run on Google App Engine with IntelliJ IDEA
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  Google App Engine support for MyFaces 2 made trunk and it is released with MyFaces Core 2.0.0-beta-3. 
-  In this tutorial, I will explain how to use it with IntelliJ IDEA. I assume that you have basic 
-  IDEA, JSF and Facelets knowledge.
-
-  You can find IDE-independent instructions {{{./googleappenginesupport.html}here}}. Additionally, there is a tutorial for Eclipse {{{./myfaces2-googleappengine-eclipse-tutorial.html}here}}. 
-
-  {{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip?attredirects=0&d=1}Here}} 
-  is the complete source code and the IDEA project of the example application (which I took from 
-  {{{https://facelets.dev.java.net/nonav/docs/dev/docbook.html}Facelets Tutorial}}) that I configured to run on 
-  Google App Engine. 
-  
-  I deployed the application explained in this tutorial at: 
-  {{{http://myfaces2-tutorial-idea.latest.aliok-com-tr-test.appspot.com/guess.jsf}http://myfaces2-tutorial-idea.latest.aliok-com-tr-test.appspot.com/guess.jsf}} 
-
-  In order to run Myfaces on Google App Engine, you need to complete the steps below. Configuration explained in this document is tested with
-  Google App Engine 1.3.0.
-
-  If you're having trouble with the figures in this page, you can download all images from 
-  {{{http://upload.aliok.com.tr/uploads/myfaces2-gae-idea-tut-all-images.zip?attredirects=0&d=1}this link}}. 
-
-*Table of Content
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
-%{toc|section=1|fromDepth=1|toDepth=1}
-
-
-*{Requirements}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  * IntelliJ IDEA Ultimate Edition
-  
-  * Google App Engine SDK
-  
-  * MyFaces Core 2.0.0 Beta 3
-  
-  * EL API and Impl
-  
-  * Basic JSF and Facelets knowledge
-  
-  * Google App Engine Account :)
-  
-  
-  
-  
-*{Downloading and Configuration}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  [[1]]  Download {{{http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Java}App Engine SDK}} and extract it to somewhere.
-  
-  [[2]]  Download {{{http://myfaces.apache.org/download.html}MyFaces Core 2.0.0 Beta 3}} (or a later version) and extract it.
-  
-  [[3]]  Download {{{http://download.java.net/maven/glassfish/javax/el/el-api/1.1/el-api-1.1.jar}EL API}} and 
-         {{{http://download.java.net/maven/glassfish/org/glassfish/web/el-impl/1.1/el-impl-1.1.jar}EL Impl}} jars.
-  
-  [[4]]  We need IntelliJ IDEA {{{Ultimate Edition}http://www.jetbrains.com/idea/download/}}. Community edition doesn't have JavaEE support, 
-         thus {{{http://plugins.intellij.net/plugin/?&id=4254}Google App Engine Plugin}} doesn't work on it. I downloaded and 
-         installed IDEA version 9.0.1, and I don't know this plugin works for older versions of the IDE.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-01-welcome.jpg] IDEA Welcome
-
-  [[5]]  After installing the IDE and running for the first time, the IDE asked me which plugins that I want. I selected 
-  		 "Google App Engine Integration" and its dependencies. If you have an existing installation, make sure you have 
-  		 "Google App Engine Integration" plugin installed and enabled. 
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-02-plugins.jpg] IDEA Plugins Screen
-
-  [[6]]  Next, we will define our App Engine Devl Server.
-  
-    [[a]] To do this, navigate to IDE settings.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-03-settings-menu.jpg] IDEA Settings Menu
-
-    [[b]] Select "Application Servers" and click "Add" button. Select "Google App Engine Dev Server".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-04-ide-settings.jpg] IDE Settings
-
-    [[c]] Select the path of the App Engine SDK.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-05-sdk-path.jpg] SDK Path Config
-
-    [[d]] You will see some JARS under the "Classes" node.
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-06-sdk-verification.jpg] SDK Verification
-
-
-
-
-
-
-*{Creating and Configuring the Project}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  [[1]] First, we will create a new project:
-    
-    [[a]] Press "File - > New Project"
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-07-new-project.jpg] New Project
-
-    [[b]] We will create the project from scratch. So, select it and press next.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-08-create-scratch.jpg] New Project from Scratch
-
-    [[c]] Type the project name, and select "Java Module".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-09-project-naming.jpg] New Project Name
-    
-    [[d]] Let IDEA crete a source directory for us.
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-10-scr-dir.jpg] New Project src Dir
-
-    [[e]] On this screen, select "Web Application" and "Google App Engine" nodes. 
-          Altough we will create a JSF project, don't select the "JavaServer Faces" node since IDEA doesn't 
-          support MyFaces 2 yet. After making sure the AppEngine SDK path is correct, 
-          press "Finish" and IDEA will create the project.
-          
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-11-tech-selection.jpg] Technology Selection
-
-  [[2]] Now, we will add the MyFaces jars as an "External Library". I did this step to solve 
-        compilation problems in my managed beans. Without explicitly adding an External Library, "javax.faces" 
-        namespace is not visible in my managed beans �which we will create in the next steps- even if the jars 
-        exist in "WEB-INF/lib". I am sure an experienced IDEA user can solve this problem in a better way.
-
-    [[a]] Right-click on the project and select "Module Settings".
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-12-module-settings.jpg] Module Settings
-
-    [[b]] You will see a screen like the one below.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-13-project-libs.jpg] Project Libs
-
-    [[c]] Press the "+" button, type "MyFaces 2 Beta 3" and press "OK".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-14-lib-name.jpg] Lib Name
-
-    [[d]] IDEA will ask which modules to add the library. Select the project you've created and press "OK".
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-15-lib-module-selecting.jpg] Project Library Module Selection
-
-    [[e]] Now we will "attach" MyFaces2 jars. While the newly created library "MyFaces 2 Beta 3" is selected, 
-          press "Attach Classes" button and select the MyFaces (and dependencies) jars.
-          
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-16-attach-classes.jpg] Attach Classes
-
-    [[f]] You should have a screen like below. Press "OK".
-    
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-17-lib-verification.jpg] Library Verification
-
-    [[g]] Here is the external libraries so far:
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-18-ext-lib-verification.jpg] External Library Verification
-
-  [[3]] Put necessary jars into "WEB-INF/lib":
-  
-    [[a]] By default, IDEA does not create a "lib" folder under "WEB-INF". So we need to create one. 
-          Right-click on "WEB-INF" folder and select "New - > Directory".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-19-lib-dir-create.jpg] lib Directory Creation
-          
-    [[b]] Type "lib" and press OK.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-20-lib-naming.jpg] lib Directory Naming
-          
-    [[c]] Copy the jars from the MyFaces release (myfaces-api-2.x.x.jar, lib/myfaces-impl-2.x.x.jar, 
-          lib/commons-logging-1.x.x.jar, lib/commons-beanutils-1.x.x.jar, lib/commons-codec-1.x.jar, 
-          commons-collections-3.x.jar, lib/commons-digester-x.x.jar, lib/commons-discovery-0.x.jar) 
-          and paste them into "WEB-INF/lib".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-21-paste-jars.jpg] Paste MyFaces Jars
-
-    [[d]] Here is the "WEB-INF/lib" jars so far:
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-22-jar-verification.jpg] MyFaces Jar Verification
-
-    [[e]] Put el-api-x.x.jar and el-impl-1.1.jar �which you've downloaded at step 3 of 
-          "Downloading and Configuration" section- into "WEB-INF/lib".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-23-paste-el-jars.jpg] Paste EL Jars
-
-  [[4]] XML configuration:
-
-    [[a]] Put the lines below into your web.xml file:
-    
-+---------------------------------------------------------------------------------------------------------+
-<web-app ...
-   ...
-   <!--
-      Need to set a secret to avoid javax.crypto.BadPaddingException.
-      "param-value" must be Base64 encoded.
-      More details: http://wiki.apache.org/myfaces/Secure_Your_Application
-   -->
-   <context-param>
-      <param-name>org.apache.myfaces.SECRET</param-name>
-      <param-value>NzY1NDMyMTA=</param-value>
-   </context-param>       
-
-   <!--
-      Facelets configuration fragment
-   -->
-   <context-param>
-      <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
-      <param-value>.xhtml</param-value>
-   </context-param>
-       
-   <servlet>
-      <servlet-name>Faces Servlet</servlet-name>
-      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
-   </servlet>
-       
-   <servlet-mapping>
-      <servlet-name>Faces Servlet</servlet-name>
-      <url-pattern>*.jsf</url-pattern>
-   </servlet-mapping>
-   ...     
-</web-app>
-+---------------------------------------------------------------------------------------------------------+
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-24-web-xml-conf.jpg] web.xml Configuration
-
-    [[b]] Create a "faces-config.xml" file under your "WEB-INF" folder, and make sure that you use the JSF 2 header in it.
-
-+---------------------------------------------------------------------------------------------------------+
-<?xml version="1.0"  encoding="UTF-8"?>
-
-<faces-config
-   xmlns="http://java.sun.com/xml/ns/javaee"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
-   version="2.0">
-   ...
-</faces-config>
-+---------------------------------------------------------------------------------------------------------+
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-25-faces-config-conf.jpg] faces-config.xml Configuration
-
-    [[c]] Add the following line into war/WEB-INF/appengine-web.xml:
-
-+---------------------------------------------------------------------------------------------------------+
-   <sessions-enabled>true</sessions-enabled>
-+---------------------------------------------------------------------------------------------------------+
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-26-appengine-web-conf.jpg] appengine-web.xml Configuration
-
-  [[5]]  Now you can add your pages, beans etc. You cannot use JSP as view technology on Google App Engine. You must 
-         use Facelets, which is the default view technology in JSF 2.
-
-         {{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip}Here}} is the complete 
-         source code and the IDEA project of the example application (which I took from 
-         {{{https://facelets.dev.java.net/nonav/docs/dev/docbook.html}Facelets Tutorial}}) that I configured to run on 
-         Google App Engine.
-
-
-
-
-*{Deploying to App Engine Development Server (Your Local Server)}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  [[1]] We need to define a run configuration.
-  
-	[[a]] Select "Run - > Edit Configurations"
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-27-edit-run-conf.jpg] Edit Run Configuration
-	
-	[[b]] Press "+" button to add a new configuration.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-28-add-new-run-conf.jpg] Adding New Run Configuration
-	
-    [[c]] Select "Google AppEngine Dev Server".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-29-add-gae-run-conf.jpg] Add GAE Run Configuration
-	
-	[[d]] Type the configuration name, and make sure your screen seems like this:
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-30-gae-run-conf-settings.jpg] GAE Run Configuration Settings
-	
-	[[e]] Select "Build Artifacts" and click "..." button. We will configure, what to export.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-31-run-conf-build.jpg] Run Configuration Build Settings
-	
-	[[f]] Select "Test-GoogleAppEngine:war exploded".
-	
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-32-run-conf-artifacts.jpg] Run Configuration Build Artifacts
-	
-
-  [[2]] Now, you can see the configuration you've defined next to "Run" button.
-
-    [[a]] Select your run configuration and press "Run".
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-33-run-conf-select.jpg] Run Configuration Selection
-	
-	[[b]]  You will see MyFaces logs on the console. You shouldn't see any exception at this step. If you saw 
-	       one, make sure you've completed all steps above.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-34-myfaces-logs.jpg] MyFaces Logs
-	
-	[[c]] You can see your application at "localhost:8080". IDEA created a dummy 
-	      index.jsp before, so it is normal to see "Place your content here" text.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-35-local-page.jpg] Local Devl Server Page
-	
-	[[d]] You can stop the GAE Devl Server by pressing stop button.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-36-stop-local-server.jpg] Stopping Local Server
-
-
-
-
-
-*{Running Facelets Tutorial Example}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  
-  I've configured a project to run on Google App Engine, which you can find the sources 
-  {{{http://sites.google.com/a/aliok.com.tr/upload/uploads/tutorial-gae-myfaces2-idea.zip}here}}.
-  You can simply copy the files guess.xhtml, response.xhtml, template.xhtml and NumberBean.java to appropriate locations.
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-37-add-stuff.jpg] Add Stuff
-
-  You can see the application running below.
-  
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-38-guess-appl-local-page.jpg] Guess Application Local Page
-
-
-
-
-
-*{Deploying to App Engine}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  [[1]] You need to set application name and version in appengine-web.xml file. You can see my 
-        config below. "application" is your application id at Google App Engine (AppSpot Id), 
-		and version is anything you like.	
-
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-39-app-engine-appl-version-conf.jpg] App Engine Application and Version Configuration
-
-  [[2]] You can upload the application by selecting "Tools - > Upload App Engine Application".
-  
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-40-upload.jpg] Uploading
-
-  [[3]] IDEA will ask about building. Build the project by clicking "Yes".
-  
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-41-upload-build.jpg] Upload : Build
-
-  [[4]] Now, IDEA will use AppEngine SDK's batch jobs to upload application. You will be asked your email and password. 
-        You can see the output of my upload below.
-  
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-42-upload-console.jpg] Upload Console
-
-  [[5]] Your application is hosted at Google App Engine now. You can see this version of the 
-        application at "Versions" page of Google App Engine administration screen. Your application 
-		is hosted at <version-I-specified>.latest.<application-ID>.appspot.com
-  
-[images/gaetutorial-idea/myfaces2-gae-idea-tut-43-gae-page.jpg] GAE Page
diff --git a/parent/src/site/site.xml b/parent/src/site/site.xml
index ffbdb5b..7fb0534 100644
--- a/parent/src/site/site.xml
+++ b/parent/src/site/site.xml
@@ -104,7 +104,6 @@
         <menu name="Documentation" inherit="top">
             <item name="Quick Start"     href="http://myfaces.apache.org/wiki/core/user-guide/quick-start.html"/>
             <item name="Getting Started" href="http://myfaces.apache.org/wiki/core/user-guide/getting-started.html"/>
-            <item name="MyFaces and Google App Engine"  href="http://myfaces.apache.org/core20/googleappenginesupport.html"/>
             <item name="Generated Javadoc, Tlddoc and Others"        href="./javadoc.html"/>
             <item name="MyFaces Release Checklist"        href="./release-checklist.html"/>
             <item name="FAQ"             href="http://myfaces.apache.org/wiki/core/faq.html"/>
diff --git a/test/pom.xml b/test/pom.xml
index c6fcd5b..eb7246f 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -63,12 +63,6 @@
         </dependency>
 
         <dependency>
-            <groupId>commons-digester</groupId>
-            <artifactId>commons-digester</artifactId>
-            <version>1.8</version>
-        </dependency>
-
-        <dependency>
             <groupId>net.sourceforge.htmlunit</groupId>
             <artifactId>htmlunit</artifactId>
             <version>2.33</version>
diff --git a/test/src/main/java/org/apache/myfaces/test/config/ConfigParser.java b/test/src/main/java/org/apache/myfaces/test/config/ConfigParser.java
deleted file mode 100644
index b0ce0d6..0000000
--- a/test/src/main/java/org/apache/myfaces/test/config/ConfigParser.java
+++ /dev/null
@@ -1,709 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.test.config;
-
-import java.io.IOException;
-import java.net.URL;
-
-import javax.faces.FactoryFinder;
-import javax.faces.application.Application;
-import javax.faces.application.ApplicationFactory;
-import javax.faces.render.ClientBehaviorRenderer;
-import javax.faces.render.RenderKit;
-import javax.faces.render.RenderKitFactory;
-import javax.faces.render.Renderer;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.Rule;
-import org.apache.myfaces.test.mock.MockRenderKit;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * <p>Utility class to parse JavaServer Faces configuration resources, and
- * register JSF artifacts with the mock object hierarchy.</p>
- *
- * <p>The following artifacts are registered:</p>
- * <ul>
- *     <li><code>Converter</code> (by-id and by-class)</li>
- *     <li><code>RenderKit</code> and <code>Renderer</code>,<code>ClientBehaviorRenderer</code></li>
- *     <li><code>UIComponent</code></li>
- *     <li><code>Validator</code></li>
- *     <li><code>Behavior</code></li>
- * </ul>
- *
- * <p>Note that any declared <em>factory</em> instances are explicitly
- * <strong>NOT</strong> registered, allowing the mock object hierarchy
- * of the Myfaces Test Framework to manage these APIs.</p>
- *
- * <p><strong>USAGE NOTE</strong> - If you are using an instance of this
- * class within a subclass of <code>AbstractJsfTestCase</code> or
- * <code>AbstractJmockJsfTestCase</code>, be sure you have completed the
- * <code>setUp()</code> processing in this base class before calling one
- * of the <code>parse()</code> methods.</p>
- *
- * @since 1.0.0
- */
-public class ConfigParser
-{
-
-    // ------------------------------------------------------------ Constructors
-
-    /** Creates a new instance of ConfigParser */
-    public ConfigParser()
-    {
-    }
-
-    // ------------------------------------------------------ Manifest Constants
-
-    /**
-     * <p>Configuration resource URLs for the JSF RI.</p>
-     */
-    private static final String[] JSFRI_RESOURCES = { "/com/sun/faces/jsf-ri-runtime.xml", };
-
-    /**
-     * <p>Configuration resource URLs for Apache MyFaces.</p>
-     */
-    private static final String[] MYFACES_RESOURCES = { "/org/apache/myfaces/resource/standard-faces-config.xml", };
-
-    /**
-     * <p>Configuration resource URLs for Apache MyFaces 1.2.</p>
-     */
-    private static final String[] MYFACES_RESOURCES12 = { "/META-INF/standard-faces-config.xml", };
-
-    // ------------------------------------------------------ Instance Variables
-
-    /**
-     * <p>The <code>Digester</code> instance we will use for parsing.</p>
-     */
-    private Digester digester = null;
-
-    // ------------------------------------------------------- Public Properties
-
-    /**
-     * <p>Return the URLs of the platform configuration resources for this
-     * application.  The following platforms are currently supported:</p>
-     * <ul>
-     * <li>JavaServer Faces Reference Implementation (version 1.0 - 1.2)</li>
-     * <li>MyFaces (version 1.1)</li>
-     * </ul>
-     *
-     * <p>If MyFaces (version 1.2), currently under development, does not change
-     * the name of the configuration resource, it will be supported as well.</p>
-     */
-    public URL[] getPlatformURLs()
-    {
-
-        URL[] urls = translate(JSFRI_RESOURCES);
-        if (urls[0] == null)
-        {
-            urls = translate(MYFACES_RESOURCES12);
-            if (urls[0] == null)
-            {
-                urls = translate(MYFACES_RESOURCES);
-            }
-        }
-        return urls;
-
-    }
-
-    // ---------------------------------------------------------- Public Methods
-
-    /**
-     * <p>Parse the specified JavaServer Faces configuration resource, causing
-     * the appropriate JSF artifacts to be registered with the mock object
-     * hierarchy.</p>
-     *
-     * @param url <code>URL</code> of the configuration resource to parse
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception SAXException if a parsing error occurs
-     */
-    public void parse(URL url) throws IOException, SAXException
-    {
-
-        // Acquire and configure the Digester instance we will use
-        Digester digester = digester();
-        ApplicationFactory factory = (ApplicationFactory) FactoryFinder
-                .getFactory(FactoryFinder.APPLICATION_FACTORY);
-        Application application = factory.getApplication();
-        digester.push(application);
-
-        // Perform the required parsing
-        try
-        {
-            digester.parse(url);
-        }
-        finally
-        {
-            digester.clear();
-        }
-
-    }
-
-    /**
-     * <p>Parse the specified set of JavaServer Faces configuration resources,
-     * in the listed order, causing the appropriate JSF artifacts to be registered
-     * with the mock object hierarchy.</p>
-     *
-     * @param urls <code>URL</code>s of the configuration resources to parse
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception SAXException if a parsing error occurs
-     */
-    public void parse(URL[] urls) throws IOException, SAXException
-    {
-
-        for (int i = 0; i < urls.length; i++)
-        {
-            parse(urls[i]);
-        }
-
-    }
-
-    // --------------------------------------------------------- Private Methods
-
-    /**
-     * <p>Return the <code>Digester</code> instance we will use for parsing,
-     * creating and configuring a new instance if necessary.</p>
-     */
-    private Digester digester()
-    {
-
-        if (this.digester == null)
-        {
-            this.digester = new Digester();
-            digester.addRule("faces-config/component", new ComponentRule());
-            digester.addCallMethod("faces-config/component/component-type",
-                    "setComponentType", 0);
-            digester.addCallMethod("faces-config/component/component-class",
-                    "setComponentClass", 0);
-            digester.addRule("faces-config/converter", new ConverterRule());
-            digester.addCallMethod("faces-config/converter/converter-id",
-                    "setConverterId", 0);
-            digester.addCallMethod("faces-config/converter/converter-class",
-                    "setConverterClass", 0);
-            digester.addCallMethod(
-                    "faces-config/converter/converter-for-class",
-                    "setConverterForClass", 0);
-            digester.addRule("faces-config/render-kit", new RenderKitRule());
-            digester.addRule("faces-config/render-kit/render-kit-id",
-                    new RenderKitIdRule());
-            digester.addRule("faces-config/render-kit/renderer",
-                    new RendererRule());
-            digester.addCallMethod(
-                    "faces-config/render-kit/renderer/component-family",
-                    "setComponentFamily", 0);
-            digester.addCallMethod(
-                    "faces-config/render-kit/renderer/renderer-class",
-                    "setRendererClass", 0);
-            digester.addCallMethod(
-                    "faces-config/render-kit/renderer/renderer-type",
-                    "setRendererType", 0);
-            digester.addRule(
-                    "faces-config/render-kit/client-behavior-renderer",
-                    new ClientBehaviorRendererRule());
-            digester
-                    .addCallMethod(
-                            "faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-type",
-                            "setClientBehaviorRendererType", 0);
-            digester
-                    .addCallMethod(
-                            "faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-class",
-                            "setClientBehaviorRendererClass", 0);
-            digester.addRule("faces-config/validator", new ValidatorRule());
-            digester.addCallMethod("faces-config/validator/validator-id",
-                    "setValidatorId", 0);
-            digester.addCallMethod("faces-config/validator/validator-class",
-                    "setValidatorClass", 0);
-            digester.addRule("faces-config/behavior", new BehaviorRule());
-            digester.addCallMethod("faces-config/behavior/behavior-id",
-                    "setBehaviorId", 0);
-            digester.addCallMethod("faces-config/behavior/behavior-class",
-                    "setBehaviorClass", 0);
-        }
-        return this.digester;
-
-    }
-
-    /**
-     * <p>Translate an array of resource names into an array of resource URLs.</p>
-     *
-     * @param names Resource names to translate
-     */
-    private URL[] translate(String[] names)
-    {
-
-        URL[] results = new URL[names.length];
-        for (int i = 0; i < names.length; i++)
-        {
-            results[i] = this.getClass().getResource(names[i]);
-        }
-        return results;
-
-    }
-
-    // --------------------------------------------------------- Private Classes
-
-    /**
-     * <p>Data bean that stores information related to a component.</p>
-     */
-    class ComponentBean
-    {
-
-        private String componentClass;
-
-        public String getComponentClass()
-        {
-            return this.componentClass;
-        }
-
-        public void setComponentClass(String componentClass)
-        {
-            this.componentClass = componentClass;
-        }
-
-        private String componentType;
-
-        public String getComponentType()
-        {
-            return this.componentType;
-        }
-
-        public void setComponentType(String componentType)
-        {
-            this.componentType = componentType;
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing components.</p>
-     */
-    class ComponentRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new ComponentBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            ComponentBean bean = (ComponentBean) getDigester().pop();
-            Application application = (Application) getDigester().peek();
-            application.addComponent(bean.getComponentType(), bean
-                    .getComponentClass());
-        }
-
-    }
-
-    /**
-     * <p>Data bean that stores information related to a converter.</p>
-     */
-    class ConverterBean
-    {
-
-        private String converterClass;
-
-        public String getConverterClass()
-        {
-            return this.converterClass;
-        }
-
-        public void setConverterClass(String converterClass)
-        {
-            this.converterClass = converterClass;
-        }
-
-        private String converterForClass;
-
-        public String getConverterForClass()
-        {
-            return this.converterForClass;
-        }
-
-        public void setConverterForClass(String converterForClass)
-        {
-            this.converterForClass = converterForClass;
-        }
-
-        private String converterId;
-
-        public String getConverterId()
-        {
-            return this.converterId;
-        }
-
-        public void setConverterId(String converterId)
-        {
-            this.converterId = converterId;
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing converers.</p>
-     */
-    class ConverterRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new ConverterBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            ConverterBean bean = (ConverterBean) getDigester().pop();
-            Application application = (Application) getDigester().peek();
-            if (bean.getConverterId() != null)
-            {
-                application.addConverter(bean.getConverterId(), bean
-                        .getConverterClass());
-            }
-            else
-            {
-                Class clazz = null;
-                try
-                {
-                    clazz = classForName(bean.getConverterForClass());
-                }
-                catch (ClassNotFoundException e)
-                {
-                    throw new IllegalArgumentException(
-                            "java.lang.ClassNotFoundException: "
-                                    + bean.getConverterForClass());
-                }
-                application.addConverter(clazz, bean.getConverterClass());
-            }
-        }
-
-    }
-
-    private Class classForName(String type) throws ClassNotFoundException
-    {
-        try
-        {
-            // Try WebApp ClassLoader first
-            return Class.forName(type, false, // do not initialize for faster startup
-                    Thread.currentThread().getContextClassLoader());
-        }
-        catch (ClassNotFoundException ignore)
-        {
-            // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib)
-            return Class.forName(type, false, // do not initialize for faster startup
-                    this.getClass().getClassLoader());
-        }
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing render kits.</p>
-     */
-    class RenderKitRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            RenderKitFactory factory = (RenderKitFactory) FactoryFinder
-                    .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
-            getDigester().push(
-                    factory.getRenderKit(null,
-                            RenderKitFactory.HTML_BASIC_RENDER_KIT));
-        }
-
-        public void end(String namespace, String name)
-        {
-            getDigester().pop();
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing render kit identifiers.</p>
-     */
-    class RenderKitIdRule extends Rule
-    {
-
-        public void body(String namespace, String name, String text)
-        {
-            String renderKitId = text.trim();
-            RenderKitFactory factory = (RenderKitFactory) FactoryFinder
-                    .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
-            RenderKit renderKit = factory.getRenderKit(null, renderKitId);
-            if (renderKit == null)
-            {
-                renderKit = new MockRenderKit();
-                factory.addRenderKit(renderKitId, renderKit);
-            }
-            getDigester().pop();
-            getDigester().push(renderKit);
-        }
-
-    }
-
-    /**
-     * <p>Data bean that stores information related to a renderer.</p>
-     */
-    class RendererBean
-    {
-
-        private String componentFamily;
-
-        public String getComponentFamily()
-        {
-            return this.componentFamily;
-        }
-
-        public void setComponentFamily(String componentFamily)
-        {
-            this.componentFamily = componentFamily;
-        }
-
-        private String rendererClass;
-
-        public String getRendererClass()
-        {
-            return this.rendererClass;
-        }
-
-        public void setRendererClass(String rendererClass)
-        {
-            this.rendererClass = rendererClass;
-        }
-
-        private String rendererType;
-
-        public String getRendererType()
-        {
-            return this.rendererType;
-        }
-
-        public void setRendererType(String rendererType)
-        {
-            this.rendererType = rendererType;
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing renderers.</p>
-     */
-    class RendererRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new RendererBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            RendererBean bean = (RendererBean) getDigester().pop();
-            RenderKit kit = (RenderKit) getDigester().peek();
-            Renderer renderer = null;
-            Class clazz = null;
-            try
-            {
-                clazz = classForName(bean.getRendererClass());
-                renderer = (Renderer) clazz.newInstance();
-            }
-            catch (Exception e)
-            {
-                throw new IllegalArgumentException(
-                        "Exception while trying to instantiate"
-                                + " renderer class '" + bean.getRendererClass()
-                                + "' : " + e.getMessage());
-            }
-            kit.addRenderer(bean.getComponentFamily(), bean.getRendererType(),
-                    renderer);
-        }
-
-    }
-
-    /**
-     * <p>Data bean that stores information related to a validator.</p>
-     */
-    class ValidatorBean
-    {
-
-        private String validatorClass;
-
-        public String getValidatorClass()
-        {
-            return this.validatorClass;
-        }
-
-        public void setValidatorClass(String validatorClass)
-        {
-            this.validatorClass = validatorClass;
-        }
-
-        private String validatorId;
-
-        public String getValidatorId()
-        {
-            return this.validatorId;
-        }
-
-        public void setValidatorId(String validatorId)
-        {
-            this.validatorId = validatorId;
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing validators.</p>
-     */
-    class ValidatorRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new ValidatorBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            ValidatorBean bean = (ValidatorBean) getDigester().pop();
-            Application application = (Application) getDigester().peek();
-            application.addValidator(bean.getValidatorId(), bean
-                    .getValidatorClass());
-        }
-
-    }
-
-    class ClientBehaviorRendererBean
-    {
-        private String clientBehaviorRendererType;
-
-        private String clientBehaviorRendererClass;
-
-        public String getClientBehaviorRendererType()
-        {
-            return clientBehaviorRendererType;
-        }
-
-        public void setClientBehaviorRendererType(
-                String clientBehaviorRendererType)
-        {
-            this.clientBehaviorRendererType = clientBehaviorRendererType;
-        }
-
-        public String getClientBehaviorRendererClass()
-        {
-            return clientBehaviorRendererClass;
-        }
-
-        public void setClientBehaviorRendererClass(
-                String clientBehaviorRendererClass)
-        {
-            this.clientBehaviorRendererClass = clientBehaviorRendererClass;
-        }
-    }
-
-    class ClientBehaviorRendererRule extends Rule
-    {
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new ClientBehaviorRendererBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            ClientBehaviorRendererBean bean = (ClientBehaviorRendererBean) getDigester()
-                    .pop();
-            RenderKit kit = (RenderKit) getDigester().peek();
-            ClientBehaviorRenderer renderer = null;
-            Class clazz = null;
-            try
-            {
-                clazz = classForName(bean.getClientBehaviorRendererClass());
-                renderer = (ClientBehaviorRenderer) clazz.newInstance();
-            }
-            catch (Exception e)
-            {
-                throw new IllegalArgumentException(
-                        "Exception while trying to instantiate"
-                                + " client behavior renderer class '"
-                                + bean.getClientBehaviorRendererClass()
-                                + "' : " + e.getMessage());
-            }
-            kit.addClientBehaviorRenderer(bean.getClientBehaviorRendererType(),
-                    renderer);
-        }
-    }
-
-    /**
-     * <p>Data bean that stores information related to a behavior.</p>
-     */
-    class BehaviorBean
-    {
-
-        private String behaviorClass;
-
-        public String getBehaviorClass()
-        {
-            return this.behaviorClass;
-        }
-
-        @SuppressWarnings("unused")
-        public void setBehaviorClass(String behaviorClass)
-        {
-            this.behaviorClass = behaviorClass;
-        }
-
-        private String behaviorId;
-
-        public String getBehaviorId()
-        {
-            return this.behaviorId;
-        }
-
-        @SuppressWarnings("unused")
-        public void setBehaviorId(String behaviorId)
-        {
-            this.behaviorId = behaviorId;
-        }
-
-    }
-
-    /**
-     * <p>Digester <code>Rule</code> for processing behaviors.</p>
-     */
-    class BehaviorRule extends Rule
-    {
-
-        public void begin(String namespace, String name, Attributes attributes)
-        {
-            getDigester().push(new BehaviorBean());
-        }
-
-        public void end(String namespace, String name)
-        {
-            BehaviorBean bean = (BehaviorBean) getDigester().pop();
-            Application application = (Application) getDigester().peek();
-            application.addBehavior(bean.getBehaviorId(), bean
-                    .getBehaviorClass());
-        }
-
-    }
-}
diff --git a/test/src/main/java/org/apache/myfaces/test/mock/MockApplication20.java b/test/src/main/java/org/apache/myfaces/test/mock/MockApplication20.java
index 0960545..976a1b3 100644
--- a/test/src/main/java/org/apache/myfaces/test/mock/MockApplication20.java
+++ b/test/src/main/java/org/apache/myfaces/test/mock/MockApplication20.java
@@ -31,6 +31,8 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.el.ELContext;
 import javax.el.ValueExpression;
@@ -59,8 +61,6 @@
 import javax.faces.validator.Validator;
 import javax.faces.view.ViewDeclarationLanguage;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.test.mock.resource.MockResourceHandler;
 
 /**
@@ -213,7 +213,7 @@
 
     // ------------------------------------------------------ Instance Variables
 
-    private static final Log log = LogFactory.getLog(MockApplication20.class);
+    private static final Logger log = Logger.getLogger(MockApplication20.class.getName());
 
     private final Map<Class<? extends SystemEvent>, SystemListenerEntry> _systemEventListenerClassMap = 
         new ConcurrentHashMap<Class<? extends SystemEvent>, SystemListenerEntry>();
@@ -468,7 +468,7 @@
         if (renderer == null)
         {
             // If no such Renderer can be found, a message must be logged with a helpful error message.
-            log.error("renderer cannot be found for component type " + componentType + " and renderer type "
+            log.log(Level.SEVERE, "renderer cannot be found for component type " + componentType + " and renderer type "
                     + rendererType);
         }
         else
@@ -620,16 +620,18 @@
             // If the act of invoking the processListener method causes an AbortProcessingException to be thrown, 
             // processing of the listeners must be aborted, no further processing of the listeners for this event must 
             // take place, and the exception must be logged with Level.SEVERE.
-            log.error("Event processing was aborted", e);
+            log.log(Level.SEVERE, "Event processing was aborted", e);
         }
     }
 
+    @Override
     public void publishEvent(FacesContext facesContext,
             Class<? extends SystemEvent> systemEventClass, Object source)
     {
         publishEvent(facesContext, systemEventClass, source.getClass(), source);
     }
 
+    @Override
     public ProjectStage getProjectStage()
     {
         // If the value has already been determined by a previous call to this
@@ -994,17 +996,17 @@
                     }
                     catch (InstantiationException e)
                     {
-                        log.error("Could not instantiate component class name = " + fqcn, e);
+                        log.log(Level.SEVERE, "Could not instantiate component class name = " + fqcn, e);
                         throw new FacesException("Could not instantiate component class name = " + fqcn, e);
                     }
                     catch (IllegalAccessException e)
                     {
-                        log.error("Could not instantiate component class name = " + fqcn, e);
+                        log.log(Level.SEVERE, "Could not instantiate component class name = " + fqcn, e);
                         throw new FacesException("Could not instantiate component class name = " + fqcn, e);
                     }
                     catch (Exception e)
                     {
-                        log.error("Could not instantiate component class name = " + fqcn, e);
+                        log.log(Level.SEVERE, "Could not instantiate component class name = " + fqcn, e);
                     }
                 }
 
diff --git a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/DefaultRestoreViewSupport.java b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/DefaultRestoreViewSupport.java
index 813066d..8b5c509 100644
--- a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/DefaultRestoreViewSupport.java
+++ b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/DefaultRestoreViewSupport.java
@@ -21,6 +21,8 @@
 
 import java.util.Iterator;
 import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.el.ValueExpression;
 import javax.faces.FacesException;
@@ -28,9 +30,6 @@
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 /**
  * @author Mathias Broekelmann (latest modification by $Author: mbr $)
  * @version $Revision: 517403 $ $Date: 2007-03-12 22:17:00 +0100 (Mo, 12 Mrz 2007) $
@@ -42,7 +41,7 @@
 
     private static final String JAVAX_SERVLET_INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
 
-    private final Log log = LogFactory.getLog(DefaultRestoreViewSupport.class);
+    private static final Logger log = Logger.getLogger(DefaultRestoreViewSupport.class.getName());
 
     public void processComponentBinding(FacesContext facesContext,
             UIComponent component)
@@ -67,12 +66,11 @@
 
         String viewId = (String) requestMap
                 .get(JAVAX_SERVLET_INCLUDE_PATH_INFO);
-        boolean traceEnabled = log.isTraceEnabled();
         if (viewId != null)
         {
-            if (traceEnabled)
+            if (log.isLoggable(Level.FINEST))
             {
-                log.trace("Calculated viewId '" + viewId
+                log.log(Level.FINEST, "Calculated viewId '" + viewId
                         + "' from request param '"
                         + JAVAX_SERVLET_INCLUDE_PATH_INFO + '\'');
             }
@@ -80,9 +78,9 @@
         else
         {
             viewId = externalContext.getRequestPathInfo();
-            if (viewId != null && traceEnabled)
+            if (viewId != null && log.isLoggable(Level.FINEST))
             {
-                log.trace("Calculated viewId '" + viewId
+                log.log(Level.FINEST, "Calculated viewId '" + viewId
                         + "' from request path info");
             }
         }
@@ -91,9 +89,9 @@
         {
             viewId = (String) requestMap
                     .get(JAVAX_SERVLET_INCLUDE_SERVLET_PATH);
-            if (viewId != null && traceEnabled)
+            if (viewId != null && log.isLoggable(Level.FINEST))
             {
-                log.trace("Calculated viewId '" + viewId
+                log.log(Level.FINEST, "Calculated viewId '" + viewId
                         + "' from request param '"
                         + JAVAX_SERVLET_INCLUDE_SERVLET_PATH + '\'');
             }
@@ -102,9 +100,9 @@
         if (viewId == null)
         {
             viewId = externalContext.getRequestServletPath();
-            if (viewId != null && traceEnabled)
+            if (viewId != null && log.isLoggable(Level.FINEST))
             {
-                log.trace("Calculated viewId '" + viewId
+                log.log(Level.FINEST, "Calculated viewId '" + viewId
                         + "' from request servlet path");
             }
         }
diff --git a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/PhaseListenerManager.java b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/PhaseListenerManager.java
index 84a21aa..30bab5a 100644
--- a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/PhaseListenerManager.java
+++ b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/PhaseListenerManager.java
@@ -21,13 +21,13 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseEvent;
 import javax.faces.event.PhaseId;
 import javax.faces.event.PhaseListener;
 import javax.faces.lifecycle.Lifecycle;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 /**
  * This class encapsulates the logic used to call PhaseListeners.  It was 
@@ -40,8 +40,7 @@
 class PhaseListenerManager
 {
 
-    private static final Log log = LogFactory
-            .getLog(PhaseListenerManager.class);
+    private static final Logger log = Logger.getLogger(PhaseListenerManager.class.getName());
 
     private Lifecycle lifecycle;
     private FacesContext facesContext;
@@ -88,7 +87,7 @@
                 catch (Exception e)
                 {
                     beforePhaseSuccess[i] = false; // redundant - for clarity
-                    log.error("Exception in PhaseListener "
+                    log.log(Level.SEVERE, "Exception in PhaseListener "
                             + phaseId.toString() + " beforePhase.", e);
                     return;
                 }
@@ -115,7 +114,7 @@
                 }
                 catch (Exception e)
                 {
-                    log.error("Exception in PhaseListener "
+                    log.log(Level.SEVERE, "Exception in PhaseListener "
                             + phaseId.toString() + " afterPhase", e);
                 }
             }
diff --git a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/RestoreViewExecutor.java b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/RestoreViewExecutor.java
index 4e92def..d188cd2 100644
--- a/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/RestoreViewExecutor.java
+++ b/test/src/main/java/org/apache/myfaces/test/mock/lifecycle/RestoreViewExecutor.java
@@ -19,8 +19,8 @@
 
 package org.apache.myfaces.test.mock.lifecycle;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.apache.myfaces.test.util.Jsf11Utils;
 import org.apache.myfaces.test.util.Jsf12Utils;
 import org.apache.myfaces.test.util.JsfVersion;
@@ -44,7 +44,7 @@
 class RestoreViewExecutor implements PhaseExecutor
 {
 
-    private static final Log log = LogFactory.getLog(RestoreViewExecutor.class);
+    private static final Logger log = Logger.getLogger(RestoreViewExecutor.class.getName());
     private RestoreViewSupport _restoreViewSupport;
 
     public boolean execute(FacesContext facesContext)
@@ -72,9 +72,9 @@
 
         if (viewRoot != null)
         {
-            if (log.isTraceEnabled())
+            if (log.isLoggable(Level.FINEST))
             {
-                log.trace("View already exists in the FacesContext");
+                log.log(Level.FINEST, "View already exists in the FacesContext");
             }
 
             viewRoot.setLocale(facesContext.getExternalContext()
@@ -88,9 +88,9 @@
         // Determine if this request is a postback or initial request
         if (restoreViewSupport.isPostback(facesContext))
         {
-            if (log.isTraceEnabled())
+            if (log.isLoggable(Level.FINEST))
             {
-                log.trace("Request is a postback");
+                log.log(Level.FINEST, "Request is a postback");
             }
 
             viewRoot = viewHandler.restoreView(facesContext, viewId);
@@ -109,10 +109,9 @@
         }
         else
         {
-            if (log.isTraceEnabled())
+            if (log.isLoggable(Level.FINEST))
             {
-                log
-                        .trace("Request is not a postback. New UIViewRoot will be created");
+                log.log(Level.FINEST, "Request is not a postback. New UIViewRoot will be created");
             }
 
             viewRoot = viewHandler.createView(facesContext, viewId);
@@ -183,8 +182,7 @@
             int dot = viewId.lastIndexOf('.');
             if (dot == -1)
             {
-                log
-                        .error("Assumed extension mapping, but there is no extension in "
+                log.log(Level.SEVERE, "Assumed extension mapping, but there is no extension in "
                                 + viewId);
                 viewId = null;
             }
