diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APComplete.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APComplete.java
new file mode 100644
index 0000000..fa66398
--- /dev/null
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APComplete.java
@@ -0,0 +1,51 @@
+/*  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.portals.samples;
+
+import javax.portlet.annotations.PortletRequestScoped;
+
+/**
+ * Requestscoped bean to mark if timout occurs.
+ * 
+ * @author Scott Nicklous
+ */
+@PortletRequestScoped
+public class APComplete {
+
+   private boolean complete = false;
+   
+   public APComplete() {
+   }
+
+   /**
+    * @return the complete
+    */
+   public boolean isComplete() {
+      return complete;
+   }
+
+   /**
+    * @param complete the complete to set
+    */
+   public void setComplete(boolean complete) {
+      this.complete = complete;
+   }
+
+}
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APListener.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APListener.java
index 11847a9..2174846 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APListener.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/APListener.java
@@ -43,10 +43,9 @@
 
    private long                           start  = System.currentTimeMillis();
 
-   @Inject
-   private PortletRequestRandomNumberBean reqnum;
-   @Inject
-   private AsyncDialogBean                adb;
+   @Inject private PortletRequestRandomNumberBean reqnum;
+   @Inject private AsyncDialogBean                adb;
+   @Inject private APComplete                     completeBean;
 
    /*
     * (non-Javadoc)
@@ -59,8 +58,9 @@
 
       StringBuilder txt = new StringBuilder(128);
       txt.append("Listener: Completed. Execution time: ").append(delta).append(" milliseconds.");
-
       LOGGER.fine(txt.toString());
+      
+      completeBean.setComplete(true);
    }
 
    /*
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackIncludedServlet.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackIncludedServlet.java
deleted file mode 100644
index 9c752c2..0000000
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackIncludedServlet.java
+++ /dev/null
@@ -1,49 +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.portals.samples;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Scott Nicklous
- *
- */
-@WebServlet(urlPatterns="/ais")
-public class AsyncHackIncludedServlet extends HttpServlet {
-   private static final long serialVersionUID = 1L;
-
-   public AsyncHackIncludedServlet() {
-   }
-
-   @Override
-   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-      
-      PrintWriter writer = resp.getWriter();
-      writer.append("<p>Hello from dispatched servlet!</p>");
-
-   }
-}
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackPortlet.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackPortlet.java
deleted file mode 100644
index 80eba8c..0000000
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncHackPortlet.java
+++ /dev/null
@@ -1,166 +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.portals.samples;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-import javax.portlet.PortletException;
-import javax.portlet.ResourceRequest;
-import javax.portlet.ResourceResponse;
-import javax.portlet.ResourceURL;
-import javax.portlet.annotations.Namespace;
-import javax.portlet.annotations.RenderMethod;
-import javax.portlet.annotations.ServeResourceMethod;
-import javax.portlet.annotations.URLFactory;
-import javax.servlet.AsyncContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Resource portlet for viewing path information.
- */
-public class AsyncHackPortlet {
-   private static final Logger LOGGER = Logger.getLogger(AsyncHackPortlet.class.getName());
-
-   public static final String RESPARAM_DISPLAY = "display";
-
-   private AsyncContext context;
-   private static final String jsp = "/WEB-INF/jsp/pathinfo.jsp";
-//   private static final String jsp = "/ais";
-
-   
-   private class AsyncHackRunnable implements Runnable {
-
-      @Override
-      public void run() {
-         try {
-            Thread.sleep(1000);
-         } catch (InterruptedException e) {}
-         LOGGER.fine("Slept, now dispatching.");
-         HttpServletRequest hreq = (HttpServletRequest) context.getRequest();
-         context.dispatch(hreq.getServletContext(), jsp);
-//       context.dispatch(jsp);
-      }
-      
-   }
-
-   // Injecting the namespace & URLFactory
-   @Inject
-   @Namespace
-   private String             pid;
-   @Inject
-   private URLFactory         uf;
-
-   @RenderMethod(portletNames = { "AsyncHackPortlet" }, ordinal = 100)
-   public String getImageInclude() {
-      LOGGER.fine("Rendering async hack portlet");
-
-      StringBuilder txt = new StringBuilder(128);
-      txt.append("<h3>Async Hack Portlet</h3>");
-
-      ResourceURL resurl = uf.createResourceURL();
-
-      txt.append("<div class='infobox' id='").append(pid).append("-putResourceHere'></div>\n");
-      txt.append("<script>\n");
-      txt.append("(function () {\n");
-      txt.append("   var xhr = new XMLHttpRequest();\n");
-      txt.append("   xhr.onreadystatechange=function() {\n");
-      txt.append("      if (xhr.readyState==4 && xhr.status==200) {\n");
-      txt.append("         document.getElementById('").append(pid)
-            .append("-putResourceHere').innerHTML=xhr.responseText;\n");
-      txt.append("      }\n");
-      txt.append("   };\n");
-      txt.append("   xhr.open(\"GET\",\"").append(resurl.toString()).append("\",true);\n");
-      txt.append("   xhr.send();\n");
-      txt.append("})();\n");
-      txt.append("</script>\n");
-
-      return txt.toString();
-   }
-
-   /**
-    * This resource method generates some output directly, then includes output from a JSP as specified in the
-    * annotation.
-    * 
-    * @return The string for inclusion in the output.
-    * @throws IOException
-    * @throws PortletException 
-    */
-   @ServeResourceMethod(portletNames = { "AsyncHackPortlet" }, asyncSupported = true)
-   public void getPathInfo(ResourceRequest req, ResourceResponse resp) throws IOException, PortletException {
-      LOGGER.fine("Doing async hack resource request");
-
-      @SuppressWarnings("unchecked")
-      ArrayList<String> pathInfo = (ArrayList<String>) req.getAttribute("pathInfo");
-      if (pathInfo == null) {
-         pathInfo = new ArrayList<String>();
-      }
-
-      HttpServletRequest hreq = (HttpServletRequest) req.getAttribute("javax.portlet.debug.ServletRequest");
-      HttpServletResponse hresp = (HttpServletResponse) req.getAttribute("javax.portlet.debug.ServletResponse");
-      PathDisplay pd;
-      if (hreq != null) {
-         pd = new PathDisplay(hreq, "Resource Method (Servlet)");
-         hreq.setAttribute("pathInfo", pathInfo);
-      } else {
-         pd = new PathDisplay(req, "Resource Method (Resource)");
-         req.setAttribute("pathInfo", pathInfo);
-      }
-      pathInfo.add(pd.toMarkup());
-
-      PrintWriter writer = resp.getWriter();
-      writer.append("<h5>Async Hack Resource Request</h5>");
-      
-      StringBuilder txt = new StringBuilder(128);
-      txt.append("Trying to start async. Servlet context: ").append(hreq.getServletContext().getContextPath());
-
-//      RequestDispatcher rd = null;
-//      rd = hreq.getRequestDispatcher(jsp);
-//      txt.append("Request dispatcher: ").append(rd);
-      LOGGER.fine(txt.toString());
-      txt.setLength(0);
-      
-      if (hreq != null && hresp != null) {
-         try {
-            
-            context = hreq.startAsync(hreq, hresp);
-            context.setTimeout(4000);
-            
-            txt.append("Async context: ").append((context == null) ? "null." : "not null.");
-            txt.append(" Now starting thread ... ");
-
-            AsyncHackRunnable ahr = new AsyncHackRunnable();
-            context.start(ahr);
-            
-            txt.append(" done. ");
-         } catch (Exception e) {
-            txt.append(" ... didn't work. Exception: ").append(e.toString());
-         }
-         
-         LOGGER.fine(txt.toString());
-         txt.setLength(0);
-      }
-
-   }
-
-}
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortlet.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortlet.java
index 2ae2fae..b0bac5d 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortlet.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortlet.java
@@ -60,6 +60,7 @@
       private OutputType   type;
       
       @Inject private PortletRequestRandomNumberBean reqnum;
+      @Inject private APComplete complete;
 
       public void init(PortletAsyncContext ctx, int delay, OutputType type) {
          this.ctx = ctx;
@@ -77,6 +78,11 @@
       public void run() {
          try {
             Thread.sleep(delay);
+            
+            if (complete.isComplete()) {
+               LOGGER.warning("Request completed before work was finished. processing will be aborted.");
+               return;
+            }
 
             ResourceRequest req = ctx.getResourceRequest();
             ResourceResponse resp = ctx.getResourceResponse();
diff --git a/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncOutput.jsp b/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncOutput.jsp
index 2566242..4bb077b 100644
--- a/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncOutput.jsp
+++ b/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncOutput.jsp
@@ -6,9 +6,19 @@
 
 <portlet:defineObjects />
 
-<h5><%=request.getAttribute("title") %> for portlet: ${portletConfig.getPortletName()}</h5>
-<p>Dispatch type: <%=request.getDispatcherType() %>
-<c:catch var ="catchException">
+<h5><%=request.getAttribute("title") %> for portlet: 
+<c:catch var ="exp">
+   <!-- try to get portlet name using named bean from portlet artifact producer. -->
+   <!-- Works in the case of PortletRequestDispatcher include / forward. -->
+   ${portletConfig.getPortletName()} (using named bean)
+</c:catch>
+<c:if test = "${exp != null}">
+   <!-- Contextual context not available during async dispatch -->
+   <%=portletConfig.getPortletName() %> (using JSP expression)
+</c:if>
+</h5>
+<p>Dispatch type: <%=resourceRequest.getDispatcherType() %>
+<c:catch var ="exp">
    <span style='margin-left: 2em;'>Request #: ${reqnum.getRandomNumber()}</span>
 </c:catch>
 </p>
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletArtifactProducer.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletArtifactProducer.java
index 8830f8e..8e8c8b4 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletArtifactProducer.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletArtifactProducer.java
@@ -66,7 +66,6 @@
  */
 public class PortletArtifactProducer {
    private static final Logger LOG = LoggerFactory.getLogger(PortletArtifactProducer.class);
-   private static final boolean isDebug = LOG.isDebugEnabled();
    private static final boolean isTrace = LOG.isTraceEnabled();
    
    
@@ -570,14 +569,14 @@
     * @param pval
     */
    private static void trace(String anno, String sig, String pname, String pval) {
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder(128);
          txt.append("Parameter injection trace.");
          txt.append(" Annotation: ").append(anno);
          txt.append(" Signature: ").append(sig);
          txt.append(" Param name: ").append(pname);
          txt.append(" Param value(s): ").append(pval);
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
    }
 }
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionScopedBeanMap.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionScopedBeanMap.java
index b4c3fb8..5f67f59 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionScopedBeanMap.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionScopedBeanMap.java
@@ -186,8 +186,8 @@
     */
    @Override
    public void valueUnbound(HttpSessionBindingEvent evt) {
-      if (isDebug) {
-         LOG.debug("PortletSessionBeanHolder unbound from session. ID=" + evt.getName());
+      if (isTrace) {
+         LOG.trace("PortletSessionBeanHolder unbound from session. ID=" + evt.getName());
       }
       
       synchronized(beans) {
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferencesImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferencesImpl.java
index 65cf0c9..1865fc3 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferencesImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferencesImpl.java
@@ -93,8 +93,8 @@
         // Get the portlet preferences service from container.
         preferencesService = container.getContainerServices()
         		.getPortletPreferencesService();
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Using PortletPreferencesService: "
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Using PortletPreferencesService: "
             		+ preferencesService.getClass().getName());
         }
         
@@ -106,8 +106,8 @@
                     preferences.put(p.getName(), p.clone());
                 }
             }
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Loaded default preferences: " + toString());
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Loaded default preferences: " + toString());
             }
             
             // Merge stored portlet preferences into preferences map.
@@ -120,8 +120,8 @@
             LOG.error("Error retrieving preferences.", ex);
             //TODO: Rethrow up the stack????
         }
-        if (LOG.isDebugEnabled()) {
-        	LOG.debug("Merged stored preferences: " + toString());
+        if (LOG.isTraceEnabled()) {
+        	LOG.trace("Merged stored preferences: " + toString());
         }
     }
     
@@ -221,15 +221,15 @@
         // Try to reset preference to the default values.
         PortletPreference p = defaultPreferences.get(key);
         if (p != null) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Resetting preference for key: " + key);
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Resetting preference for key: " + key);
             }
             preferences.put(key,p.clone());
         }       
         // Remove preference if default values are not defined (PLT.14.1).
         else {
-        	if (LOG.isDebugEnabled()) {
-        		LOG.debug("Resetting preference to null for key: " + key);
+        	if (LOG.isTraceEnabled()) {
+        		LOG.trace("Resetting preference to null for key: " + key);
         	}
         	preferences.remove(key);
         }
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextImpl.java
index 1ab34e4..5925678 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextImpl.java
@@ -53,8 +53,6 @@
  */
 public class PortletAsyncContextImpl implements PortletAsyncManager, AsyncContext, PortletAsyncContext {
    private static final Logger LOG = LoggerFactory.getLogger(PortletAsyncContextImpl.class);
-   private static final boolean isDebug = LOG.isDebugEnabled();
-   @SuppressWarnings("unused")
    private static final boolean isTrace = LOG.isTraceEnabled();
    
    private AsyncContext                   actx;
@@ -121,13 +119,13 @@
          PortletArtifactProducer.setPrecursors(resreq, prctx.getResponse(), prctx.getPortletConfig());
       }
       
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder();
          txt.append("Registered context.");
          txt.append(" complete: ").append(complete);
          txt.append(", isListener: ").append(isListener);
          txt.append(", doRegister: ").append(doDeregister);
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
    }
 
@@ -144,13 +142,13 @@
          PortletArtifactProducer.remove();
       }
       
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder();
          txt.append("Deregistered context.");
          txt.append(" complete: ").append(complete);
          txt.append(", isListener: ").append(isListener);
          txt.append(", doRegister: ").append(doDeregister);
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
    }
 
@@ -166,10 +164,10 @@
       if (pendingRunner != null) {
          PortletAsyncContextualRunner runner = new PortletAsyncContextualRunner();
 
-         if (isDebug) {
+         if (isTrace) {
             StringBuilder txt = new StringBuilder();
             txt.append("Executing Portlet Runnable: " + pendingRunner.getClass().getCanonicalName());
-            LOG.debug(txt.toString());
+            LOG.trace(txt.toString());
          }
 
          runner.init(this, pendingRunner);
@@ -364,12 +362,12 @@
    }
    
    private Object createInstance(Class<?> cls) {
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder();
          txt.append("Creating listener.");
          txt.append(" Bean manager: ").append(beanmgr);
          txt.append(", listener class: ").append(cls.getCanonicalName());
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
       
       Object lis = null;
@@ -384,7 +382,7 @@
       } 
       
       if (lis == null) {
-         LOG.debug("Instantiating class directly: " + cls.getCanonicalName());
+         LOG.trace("Instantiating class directly: " + cls.getCanonicalName());
          try {
             lis = cls.newInstance();
          } catch (Exception e) {
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextListener.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextListener.java
index 4e85c36..f63ddd7 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextListener.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextListener.java
@@ -49,7 +49,6 @@
    /** Logger. */
    private static final Logger LOG = LoggerFactory.getLogger(PortletAsyncContextListener.class);
    private static final boolean isDebug = LOG.isDebugEnabled();
-   @SuppressWarnings("unused")
    private static final boolean isTrace = LOG.isTraceEnabled();
    
    
@@ -104,7 +103,7 @@
    }
    
    private void trace (String meth) {
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder();
          txt.append("Firing ").append(meth).append(" event for ");
          txt.append(listeners.size()).append(" listeners.");
@@ -115,7 +114,7 @@
          }
          txt.append(", # AsyncListeners: ").append(hcnt);
          txt.append(", # PortletAsyncListeners: ").append(pcnt);
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
    }
 
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextualRunner.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextualRunner.java
index c44c27f..efe1438 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextualRunner.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletAsyncContextualRunner.java
@@ -32,8 +32,6 @@
  */
 public class PortletAsyncContextualRunner implements Runnable {
    private static final Logger LOG = LoggerFactory.getLogger(PortletAsyncContextualRunner.class);
-   private static final boolean isDebug = LOG.isDebugEnabled();
-   @SuppressWarnings("unused")
    private static final boolean isTrace = LOG.isTraceEnabled();
    
 
@@ -50,8 +48,8 @@
 
    @Override
    public void run() {
-      if (isDebug) {
-         LOG.debug("Initializing contextual environment and launching runner in thread: " + Thread.currentThread().getId());
+      if (isTrace) {
+         LOG.trace("Initializing contextual environment and launching runner in thread: " + Thread.currentThread().getId());
       }
 
       try {
@@ -61,8 +59,8 @@
          StringBuilder txt = new StringBuilder(128);
          txt.append("Exception running thread: ").append(e.toString());
       } finally {
-         if (isDebug) {
-            LOG.debug("Shutting down contextual environment for thread: " + Thread.currentThread().getId());
+         if (isTrace) {
+            LOG.trace("Shutting down contextual environment for thread: " + Thread.currentThread().getId());
          }
          pactx.deregisterContext(false);
       }
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextImpl.java
index a059fef..b092d51 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextImpl.java
@@ -56,7 +56,6 @@
  */
 public class PortletRequestContextImpl implements PortletRequestContext {
    private static final Logger LOG = LoggerFactory.getLogger(PortletRequestContextImpl.class);
-   private static final boolean isDebug = LOG.isDebugEnabled();
    private static final boolean isTrace = LOG.isTraceEnabled();
    
 
@@ -259,11 +258,11 @@
    @Override
    public DispatcherType getDispatcherType() {
       DispatcherType type = getServletRequest().getDispatcherType();
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder();
          txt.append("Dispatcher type: ").append(type);
          txt.append(", executing request body: ").append(executingRequestBody);
-         LOG.debug(txt.toString());
+         LOG.trace(txt.toString());
       }
       if (executingRequestBody && (type != DispatcherType.ASYNC)) {
          type = DispatcherType.REQUEST;
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java
index a219142..366dace 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java
@@ -36,7 +36,7 @@
                 PortletResourceResponseContext
 {
    private static final Logger    LOGGER  = LoggerFactory.getLogger(PortletResourceResponseContextImpl.class);
-   private static final boolean   isDebug = LOGGER.isDebugEnabled();
+   private static final boolean   isTrace = LOGGER.isTraceEnabled();
     
     public PortletResourceResponseContextImpl(PortletContainer container, HttpServletRequest containerRequest,
                                               HttpServletResponse containerResponse, PortletWindow window)
@@ -47,11 +47,11 @@
 
     public void setCharacterEncoding(String charset)
     {
-        if (isDebug) {
+        if (isTrace) {
            StringBuilder txt = new StringBuilder("Setting character encoding.");
            txt.append(" charset: ").append(charset);
            txt.append(" isClosed: ").append(isClosed());
-           LOGGER.debug(txt.toString());
+           LOGGER.trace(txt.toString());
         }
         if (!isClosed())
         {
@@ -85,11 +85,11 @@
     }
 
    public void setStatus(int sc) {
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder("Setting character encoding.");
          txt.append(" status code: ").append(sc);
          txt.append(" isClosed: ").append(isClosed());
-         LOGGER.debug(txt.toString());
+         LOGGER.trace(txt.toString());
       }
       if (!isClosed()) {
          getServletResponse().setStatus(sc);
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java
index 1a34d33..d8600bf 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java
@@ -21,9 +21,6 @@
 import java.util.List;
 import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import javax.portlet.Event;
 import javax.portlet.MutableRenderParameters;
 import javax.portlet.PortletMode;
@@ -38,9 +35,10 @@
 import org.apache.pluto.container.PortletWindow;
 import org.apache.pluto.container.driver.PlutoServices;
 import org.apache.pluto.container.impl.MutableRenderParametersImpl;
-import org.apache.pluto.container.impl.PortletURLImpl;
 import org.apache.pluto.driver.core.PortalRequestContext;
 import org.apache.pluto.driver.url.PortalURL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @version $Id$
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
index 81ec5e9..e27701f 100644
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
@@ -192,7 +192,7 @@
             throw new ServletException(ex);
          }
          if (LOG.isDebugEnabled()) {
-            LOG.debug(reqType + " request processed.\n\n");
+            LOG.debug(reqType + " request processed.\n");
          }
 
       }
@@ -233,7 +233,7 @@
          dispatcher.forward(request, response);
 
          if (LOG.isDebugEnabled()) {
-            LOG.debug("Render request processed.\n\n");
+            LOG.debug("Render request processed.\n");
          }
       }
    }
