Initial stab at removing ContextResolver
http://article.gmane.org/gmane.comp.apache.tiles.devel/341
http://article.gmane.org/gmane.comp.apache.tiles.devel/371

git-svn-id: https://svn.apache.org/repos/asf/tiles/framework/trunk@1291847 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tiles-parent/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java b/tiles-parent/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java
index b844d88..ea70b1d 100644
--- a/tiles-parent/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java
+++ b/tiles-parent/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java
@@ -61,7 +61,6 @@
     public void initialize(ApplicationContext applicationContext) {
         this.applicationContext = createTilesApplicationContext(applicationContext);
         ApplicationAccess.register(applicationContext);
-        ApplicationAccess.registerContextResolver(new ReflectionContextResolver(), applicationContext);
         String key = getContainerKey(this.applicationContext);
         container = createContainer(this.applicationContext);
         TilesAccess.setContainer(this.applicationContext, container, key);
diff --git a/tiles-parent/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java b/tiles-parent/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java
index 4fab66d..edb82e9 100644
--- a/tiles-parent/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java
+++ b/tiles-parent/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java
@@ -82,8 +82,6 @@
         expect(context.getApplicationScope()).andReturn(scope).anyTimes();
         expect(scope.put(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE,
                 context)).andReturn(null);
-        expect(scope.put(eq(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE),
-                isA(ReflectionContextResolver.class))).andReturn(null);
         expect(scope.put(TilesAccess.CONTAINER_ATTRIBUTE, container)).andReturn(null);
         expect(scope.remove(TilesAccess.CONTAINER_ATTRIBUTE)).andReturn(container);
 
diff --git a/tiles-parent/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java b/tiles-parent/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
index e03e4a0..1cd3e1b 100644
--- a/tiles-parent/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
+++ b/tiles-parent/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
@@ -155,7 +155,7 @@
 
         String prop = property.toString();
 
-        String[] scopes = request.getAvailableScopes();
+        String[] scopes = request.getAvailableScopes().toArray(new String[0]);
         int i = 0;
         do {
             retValue = getObject(request.getContext(scopes[i]), prop);
diff --git a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
index b7822d3..82a4745 100644
--- a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
+++ b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.el;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -77,7 +78,7 @@
         EasyMock.expect(request.getContext("application")).andReturn(
                 applicationScope).anyTimes();
         EasyMock.expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" }).anyTimes();
+                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
         ApplicationContext applicationContext = EasyMock
                 .createMock(ApplicationContext.class);
         EasyMock.expect(request.getApplicationContext()).andReturn(
diff --git a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
index 84a4bd2..4a3ca12 100644
--- a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
+++ b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.*;
 
 import java.beans.FeatureDescriptor;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -76,7 +77,7 @@
         Request request = createMock(Request.class);
 
         expect(elContext.getContext(Request.class)).andReturn(request);
-        expect(request.getAvailableScopes()).andReturn(new String[] {"one", "two"});
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"}));
 
         replay(elContext, request);
         assertFalse(resolver.getFeatureDescriptors(elContext, new Integer(1)).hasNext());
diff --git a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
index 86a92ad..b282528 100644
--- a/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
+++ b/tiles-parent/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
@@ -25,6 +25,7 @@
 
 import java.beans.FeatureDescriptor;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -90,7 +91,7 @@
         expect(request.getContext("application")).andReturn(
                 applicationScope).anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         replay(request, applicationContext);
 
@@ -151,7 +152,7 @@
         expect(request.getContext("application")).andReturn(
                 applicationScope).anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         replay(request, applicationContext);
 
@@ -191,7 +192,7 @@
         expect(request.getContext("application")).andReturn(
                 applicationScope).anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         replay(request, applicationContext);
 
@@ -258,7 +259,7 @@
         expect(request.getContext("application")).andReturn(
                 applicationScope).anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         replay(request, applicationContext);
 
diff --git a/tiles-parent/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java b/tiles-parent/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java
index 5985678..0720618 100644
--- a/tiles-parent/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java
+++ b/tiles-parent/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java
@@ -89,7 +89,6 @@
                 ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE,
                 PageContext.APPLICATION_SCOPE)).andReturn(applicationContext);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(applicationScope.get(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE)).andReturn(new ReflectionContextResolver()).anyTimes();
         expect(pageContext.getRequest()).andReturn(httpServletRequest);
         expect(pageContext.getResponse()).andReturn(httpServletResponse);
         expect(pageContext.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, PageContext.REQUEST_SCOPE)).andReturn(container);
diff --git a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
index 1878209..96a3370 100644
--- a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
+++ b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.mvel;
 
+import java.util.Arrays;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
 
@@ -88,7 +89,7 @@
         expect(request.getContext("application")).andReturn(applicationScope)
                 .anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" }).anyTimes();
+                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
         applicationContext = createMock(ApplicationContext.class);
         expect(request.getApplicationContext()).andReturn(
                 applicationContext).anyTimes();
diff --git a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java
index 0d63bf3..a1a7e79 100644
--- a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java
+++ b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.mvel;
 
+import java.util.Arrays;
 import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
@@ -62,8 +63,8 @@
     @Before
     public void setUp() {
         request = createMock(Request.class);
-        expect(request.getAvailableScopes()).andReturn(new String[]{"request",
-                "session", "application"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(
+                Arrays.asList(new String[]{"request", "session", "application"})).anyTimes();
         TilesRequestContextHolder holder = new TilesRequestContextHolder();
         holder.setTilesRequestContext(request);
         applicationContext = createMock(ApplicationContext.class);
diff --git a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java
index e6011c0..bb3693c 100644
--- a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java
+++ b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.mvel;
 
+import java.util.Arrays;
 import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
@@ -63,8 +64,8 @@
     @Before
     public void setUp() {
         request = createMock(Request.class);
-        expect(request.getAvailableScopes()).andReturn(new String[]{"request",
-                "session", "application"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(
+                Arrays.asList(new String[]{"request", "session", "application"})).anyTimes();
         TilesRequestContextHolder holder = new TilesRequestContextHolder();
         holder.setTilesRequestContext(request);
         applicationContext = createMock(ApplicationContext.class);
diff --git a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java
index 8307327..290125e 100644
--- a/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java
+++ b/tiles-parent/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java
@@ -21,6 +21,7 @@
 
 package org.apache.tiles.mvel;
 
+import java.util.Arrays;
 import static org.easymock.EasyMock.*;
 import static org.junit.Assert.*;
 
@@ -93,7 +94,7 @@
         sessionScope.put("three", "three");
         expect(request.getContext("session")).andReturn(sessionScope).anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         expect(request.getContext("application")).andReturn(applicationScope).anyTimes();
         replay(request, applicationContext);
@@ -127,7 +128,7 @@
         expect(request.getContext("session")).andReturn(sessionScope).times(
                 EXPECTED_SESSION_CALLS);
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" })
+                Arrays.asList(new String[] { "request", "session", "application" }))
                 .anyTimes();
         expect(request.getContext("application")).andReturn(applicationScope).anyTimes();
         replay(request, applicationContext);
diff --git a/tiles-parent/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java b/tiles-parent/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java
index 1c806b2..e572f6a 100644
--- a/tiles-parent/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java
+++ b/tiles-parent/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java
@@ -66,7 +66,7 @@
             Object index) {
         Request request = (Request) target;
         String attributeName = (String) index;
-        String[] availableScopes = request.getAvailableScopes();
+        String[] availableScopes = request.getAvailableScopes().toArray(new String[0]);
         for (String scopeName : availableScopes) {
             Map<String, Object> scope = request.getContext(scopeName);
             if (scope.containsKey(attributeName)) {
@@ -81,7 +81,7 @@
             Object value) {
         Request request = (Request) target;
         String attributeName = (String) name;
-        String[] availableScopes = request.getAvailableScopes();
+        String[] availableScopes = request.getAvailableScopes().toArray(new String[0]);
         for (String scopeName : availableScopes) {
             Map<String, Object> scope = request.getContext(scopeName);
             if (scope.containsKey(attributeName)) {
diff --git a/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java b/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
index e129e72..fb60fac 100644
--- a/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
+++ b/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.ognl;
 
+import java.util.Arrays;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
 
@@ -59,7 +60,7 @@
         Map<String, Object> oneScope = createMock(Map.class);
         Map<String, Object> twoScope = createMock(Map.class);
 
-        expect(request.getAvailableScopes()).andReturn(new String[] {"one", "two"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
         expect(request.getContext("one")).andReturn(oneScope).anyTimes();
         expect(request.getContext("two")).andReturn(twoScope).anyTimes();
         expect(oneScope.containsKey("name1")).andReturn(true);
@@ -87,7 +88,7 @@
         Map<String, Object> oneScope = createMock(Map.class);
         Map<String, Object> twoScope = createMock(Map.class);
 
-        expect(request.getAvailableScopes()).andReturn(new String[] {"one", "two"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
         expect(request.getContext("one")).andReturn(oneScope).anyTimes();
         expect(request.getContext("two")).andReturn(twoScope).anyTimes();
         expect(oneScope.containsKey("name1")).andReturn(true);
@@ -113,7 +114,7 @@
         Map<String, Object> oneScope = createMock(Map.class);
         Map<String, Object> twoScope = createMock(Map.class);
 
-        expect(request.getAvailableScopes()).andReturn(new String[] {"one", "two"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
         expect(request.getContext("one")).andReturn(oneScope).anyTimes();
         expect(request.getContext("two")).andReturn(twoScope).anyTimes();
         expect(oneScope.containsKey("name1")).andReturn(true);
@@ -139,7 +140,7 @@
         Map<String, Object> oneScope = createMock(Map.class);
         Map<String, Object> twoScope = createMock(Map.class);
 
-        expect(request.getAvailableScopes()).andReturn(new String[] {"one", "two"}).anyTimes();
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
         expect(request.getContext("one")).andReturn(oneScope).anyTimes();
         expect(request.getContext("two")).andReturn(twoScope).anyTimes();
         expect(oneScope.containsKey("name1")).andReturn(true);
diff --git a/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java b/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
index 1b48e45..520b9c4 100644
--- a/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
+++ b/tiles-parent/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
@@ -20,6 +20,7 @@
  */
 package org.apache.tiles.ognl;
 
+import java.util.Arrays;
 import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
@@ -97,7 +98,7 @@
         expect(request.getContext("application")).andReturn(applicationScope)
                 .anyTimes();
         expect(request.getAvailableScopes()).andReturn(
-                new String[] { "request", "session", "application" }).anyTimes();
+                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
         applicationContext = createMock(ApplicationContext.class);
         expect(request.getApplicationContext()).andReturn(
                 applicationContext).anyTimes();
diff --git a/tiles-parent/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java b/tiles-parent/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java
index 24c97af..eec6405 100644
--- a/tiles-parent/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java
+++ b/tiles-parent/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java
@@ -71,7 +71,7 @@
         Map<String, Object> attributes = getImportedAttributes(
                 name, toName, ignore, request);
         if (scope == null) {
-            scope = request.getAvailableScopes()[0];
+            scope = request.getAvailableScopes().get(0);
         }
         request.getContext(scope).putAll(attributes);
     }
diff --git a/tiles-parent/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java b/tiles-parent/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java
index 3d819b9..cfb4f53 100644
--- a/tiles-parent/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java
+++ b/tiles-parent/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java
@@ -46,7 +46,6 @@
 import org.apache.tiles.access.TilesAccess;
 import org.apache.tiles.request.ApplicationAccess;
 import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.scope.ContextResolver;
 import org.apache.tiles.request.velocity.VelocityRequest;
 import org.apache.velocity.context.Context;
 import org.apache.velocity.context.InternalContextAdapter;
@@ -110,15 +109,12 @@
         AttributeContext attributeContext = createMock(AttributeContext.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
         Attribute attribute = new Attribute("myValue");
-        ContextResolver resolver = createMock(ContextResolver.class);
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
@@ -127,11 +123,11 @@
         expect(attributeContext.getAttribute("myAttribute")).andReturn(attribute);
 
         replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
         initializeTool();
         assertEquals(attribute, tool.get("myAttribute"));
         verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
     }
 
     /**
@@ -190,27 +186,25 @@
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
         StringWriter writer = new StringWriter();
         Attribute attribute = new Attribute("myValue");
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
         container.render(eq(attribute), isA(VelocityRequest.class));
 
         replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
         initializeTool();
         Renderable renderable = tool.render(attribute);
         renderable.render(internalContextAdapter, writer);
         verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
     }
 
     /**
@@ -224,27 +218,25 @@
         InternalContextAdapter internalContextAdapter = createMock(InternalContextAdapter.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
         StringWriter writer = new StringWriter();
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
         container.render(eq("myDefinition"), isA(VelocityRequest.class));
 
         replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
         initializeTool();
         Renderable renderable = tool.renderDefinition("myDefinition");
         renderable.render(internalContextAdapter, writer);
         verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
     }
 
     /**
@@ -257,27 +249,25 @@
         InternalContextAdapter internalContextAdapter = createMock(InternalContextAdapter.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
         StringWriter writer = new StringWriter();
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
         container.renderContext(isA(VelocityRequest.class));
 
         replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
         initializeTool();
         Renderable renderable = tool.renderAttributeContext();
         renderable.render(internalContextAdapter, writer);
         verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext, resolver);
+                internalContextAdapter, applicationContext);
     }
 
     /**
@@ -288,15 +278,13 @@
         TilesContainer container = createMock(TilesContainer.class);
         AttributeContext attributeContext = createMock(AttributeContext.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
@@ -304,11 +292,11 @@
                 .andReturn(attributeContext);
 
         replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
         initializeTool();
         assertEquals(attributeContext, tool.startAttributeContext());
         verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
     }
 
     /**
@@ -319,26 +307,24 @@
         TilesContainer container = createMock(TilesContainer.class);
         AttributeContext attributeContext = createMock(AttributeContext.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
         container.endContext(isA(VelocityRequest.class));
 
         replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
         initializeTool();
         tool.endAttributeContext();
         verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
     }
 
     /**
@@ -349,15 +335,13 @@
         TilesContainer container = createMock(TilesContainer.class);
         AttributeContext attributeContext = createMock(AttributeContext.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
+
         Map<String, Object> requestScope = new HashMap<String, Object>();
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
@@ -365,11 +349,11 @@
                 .andReturn(attributeContext);
 
         replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
         initializeTool();
         assertEquals(attributeContext, tool.getAttributeContext());
         verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext, resolver);
+                attributeContext, applicationContext);
     }
 
     /**
@@ -382,22 +366,21 @@
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
         Map<String, Object> applicationScope = new HashMap<String, Object>();
         applicationScope.put("myKey", container);
-        ContextResolver resolver = createMock(ContextResolver.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
+        Map<String, Object> requestScope = new HashMap<String, Object>();
+        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
+        request.setAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
+        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(resolver.getContext(isA(VelocityRequest.class),
-                eq("request"))).andReturn(requestScope).anyTimes();
         expect(servletContext.getAttribute(ApplicationAccess
                 .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
                 .anyTimes();
 
-        replay(velocityContext, request, response, servletContext, container, applicationContext, resolver);
+        replay(velocityContext, request, response, servletContext, container, applicationContext);
         initializeTool();
         assertEquals(tool, tool.setCurrentContainer("myKey"));
         assertEquals(container, requestScope.get(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME));
-        verify(velocityContext, request, response, servletContext, container, applicationContext, resolver);
+        verify(velocityContext, request, response, servletContext, container, applicationContext);
     }
 
     /**
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractClientRequest.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractClientRequest.java
index 23efd77..f74087e 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractClientRequest.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/AbstractClientRequest.java
@@ -21,9 +21,9 @@
 package org.apache.tiles.request;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
-import org.apache.tiles.request.scope.ContextResolver;
 
 /**
  * Base class for "client" requests, i.e. requests that come unchanged by the
@@ -70,15 +70,8 @@
     }
 
     @Override
-    public Map<String, Object> getContext(String scope) {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(applicationContext);
-        return resolver.getContext(this, scope);
-    }
-
-    @Override
-    public String[] getAvailableScopes() {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(applicationContext);
-        return resolver.getAvailableScopes(this);
+    public List<String> getAvailableScopes() {
+        return getNativeScopes();
     }
 
     /**
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/ApplicationAccess.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/ApplicationAccess.java
index ba69e19..260e791 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/ApplicationAccess.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/ApplicationAccess.java
@@ -20,7 +20,6 @@
  */
 package org.apache.tiles.request;
 
-import org.apache.tiles.request.scope.ContextResolver;
 
 /**
  * Entry point to get information about the application.
@@ -36,12 +35,6 @@
         ApplicationContext.class.getName() + ".ATTRIBUTE";
 
     /**
-     * The attribute name containing the context resolver.
-     */
-    public static final String CONTEXT_RESOLVER_ATTRIBUTE =
-        ContextResolver.class.getName() + ".ATTRIBUTE";
-
-    /**
      * Constructor.
      */
     private ApplicationAccess() {
@@ -58,28 +51,4 @@
                 APPLICATION_CONTEXT_ATTRIBUTE, applicationContext);
     }
 
-    /**
-     * Registers a context resolver. It will be registered into application context as an
-     * attribute, using the {@link #CONTEXT_RESOLVER_ATTRIBUTE} name.
-     *
-     * @param contextResolver The context resolver to register.
-     * @param applicationContext The application context to register.
-     */
-    public static void registerContextResolver(ContextResolver contextResolver,
-            ApplicationContext applicationContext) {
-        applicationContext.getApplicationScope().put(
-                CONTEXT_RESOLVER_ATTRIBUTE, contextResolver);
-    }
-
-    /**
-     * Returns the context resolver.
-     *
-     * @param applicationContext The application context.
-     * @return The context resolver.
-     */
-    public static ContextResolver getContextResolver(
-            ApplicationContext applicationContext) {
-        return (ContextResolver) applicationContext.getApplicationScope().get(
-                CONTEXT_RESOLVER_ATTRIBUTE);
-    }
 }
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DefaultRequestWrapper.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DefaultRequestWrapper.java
index 89a4ecf..e36b979 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DefaultRequestWrapper.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DefaultRequestWrapper.java
@@ -25,11 +25,12 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
 import org.apache.tiles.request.attribute.Addable;
-import org.apache.tiles.request.scope.ContextResolver;
 
 /**
  * Delegate for ease of customization.
@@ -121,20 +122,16 @@
 
     /** {@inheritDoc} */
     public Map<String, Object> getContext(String scope) {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(context
-                .getApplicationContext());
-        return resolver.getContext(this, scope);
+        return context.getContext(scope);
     }
 
     /** {@inheritDoc} */
-    public String[] getNativeScopes() {
-        return null;
+    public List<String> getNativeScopes() {
+        return Collections.<String>emptyList();
     }
 
     /** {@inheritDoc} */
-    public String[] getAvailableScopes() {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(context
-                .getApplicationContext());
-        return resolver.getAvailableScopes(this);
+    public List<String> getAvailableScopes() {
+        return context.getAvailableScopes();
     }
 }
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DispatchRequestWrapper.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DispatchRequestWrapper.java
index 58d7fc8..6ccb779 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DispatchRequestWrapper.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/DispatchRequestWrapper.java
@@ -24,11 +24,12 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
 import org.apache.tiles.request.attribute.Addable;
-import org.apache.tiles.request.scope.ContextResolver;
 
 /**
  * Delegate for ease of customization.
@@ -75,21 +76,17 @@
 
     /** {@inheritDoc} */
     public Map<String, Object> getContext(String scope) {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(context
-                .getApplicationContext());
-        return resolver.getContext(this, scope);
+        return context.getContext(scope);
     }
 
     /** {@inheritDoc} */
-    public String[] getNativeScopes() {
-        return null;
+    public List<String> getNativeScopes() {
+        return Collections.<String>emptyList();
     }
 
     /** {@inheritDoc} */
-    public String[] getAvailableScopes() {
-        ContextResolver resolver = ApplicationAccess.getContextResolver(context
-                .getApplicationContext());
-        return resolver.getAvailableScopes(this);
+    public List<String> getAvailableScopes() {
+        return context.getAvailableScopes();
     }
 
     /** {@inheritDoc} */
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
index a81a087..3ce93c9 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
@@ -24,6 +24,7 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -77,7 +78,7 @@
      *
      * @return The native scopes.
      */
-    String[] getNativeScopes();
+    List<String> getNativeScopes();
 
     /**
      * Returns all available scopes, that are the ones returned by
@@ -85,7 +86,7 @@
      *
      * @return All the available scopes.
      */
-    String[] getAvailableScopes();
+    List<String> getAvailableScopes();
 
     /**
      * Returns the associated application context.
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java
deleted file mode 100644
index 3005fe2..0000000
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ContextResolver.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * $Id$
- *
- * 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.tiles.request.scope;
-
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Allows to retrieve scopes managed into a request.
- *
- * @version $Rev$ $Date$
- */
-public interface ContextResolver {
-
-    /**
-     * Returns a scope map (context) given the request and the scope name.
-     *
-     * @param request The request.
-     * @param scope The name of the scope.
-     * @return The context, if present.
-     */
-    Map<String, Object> getContext(Request request, String scope);
-
-    /**
-     * Returns the name of all available scopes.
-     *
-     * @param request The request.
-     * @return All the available scopes.
-     */
-    String[] getAvailableScopes(Request request);
-}
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/NoSuchScopeException.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/NoSuchScopeException.java
deleted file mode 100644
index e6eaf07..0000000
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/NoSuchScopeException.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * $Id$
- *
- * 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.tiles.request.scope;
-
-import org.apache.tiles.request.RequestException;
-
-/**
- * Thrown when a scope cannot be found.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchScopeException extends RequestException {
-
-    /**
-     * Constructor.
-     */
-    public NoSuchScopeException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     */
-    public NoSuchScopeException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param cause The cause.
-     */
-    public NoSuchScopeException(Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     * @param cause The cause.
-     */
-    public NoSuchScopeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java
index 1d6fcaa..0cfdc29 100644
--- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java
+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/scope/ReflectionContextResolver.java
@@ -37,7 +37,7 @@
  *
  * @version $Rev$ $Date$
  */
-public class ReflectionContextResolver implements ContextResolver {
+public final class ReflectionContextResolver{
 
     /**
      * Maps a request class to all available scopes.
@@ -45,8 +45,6 @@
     private Map<Class<? extends Request>, Set<String>> class2scopes =
         new HashMap<Class<? extends Request>, Set<String>>();
 
-    @SuppressWarnings("unchecked")
-    @Override
     public Map<String, Object> getContext(Request request, String scope) {
         String methodName = "get" + Character.toUpperCase(scope.charAt(0))
                 + scope.substring(1) + "Scope";
@@ -58,31 +56,30 @@
                 RequestWrapper wrapper = (RequestWrapper) request;
                 return getContext(wrapper.getWrappedRequest(), scope);
             }
-            throw new NoSuchScopeException("No accessor method for '" + scope
+            throw new IllegalArgumentException("No accessor method for '" + scope
                     + "' scope.", e);
         }
         try {
             return (Map<String, Object>) method.invoke(request);
         } catch (IllegalAccessException e) {
             // Should not ever happen, since method is public.
-            throw new NoSuchScopeException("No accessible method for '" + scope
+            throw new IllegalArgumentException("No accessible method for '" + scope
                     + "' scope.", e);
         } catch (InvocationTargetException e) {
-            throw new NoSuchScopeException(
+            throw new IllegalArgumentException(
                     "Exception during execution of accessor method for '"
                             + scope + "' scope.", e);
         }
     }
 
-    @Override
-    public String[] getAvailableScopes(Request request) {
+    public String[] getAvailableScopes(Request r) {
+        Request request = r;
         Set<String> scopes = new LinkedHashSet<String>();
         boolean finished = false;
         do {
             scopes.addAll(getSpecificScopeSet(request));
             if (request instanceof RequestWrapper) {
-                request = ((RequestWrapper) request)
-                        .getWrappedRequest();
+                request = ((RequestWrapper) request).getWrappedRequest();
             } else {
                 finished = true;
             }
@@ -102,11 +99,8 @@
         Set<String> scopes = class2scopes.get(request.getClass());
         if (scopes == null) {
             scopes = new LinkedHashSet<String>();
-            String[] nativeScopes = request.getNativeScopes();
-            if (nativeScopes != null) {
-                for (String scopeName : nativeScopes) {
-                    scopes.add(scopeName);
-                }
+            for (String scopeName : request.getNativeScopes()) {
+                scopes.add(scopeName);
             }
             class2scopes.put(request.getClass(), scopes);
         }
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractClientRequestTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractClientRequestTest.java
index 1d11153..9a62e8a 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractClientRequestTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractClientRequestTest.java
@@ -24,10 +24,10 @@
 import static org.junit.Assert.*;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.tiles.request.scope.ContextResolver;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -54,19 +54,12 @@
     private Map<String, Object> applicationScope;
 
     /**
-     * The context resolver.
-     */
-    private ContextResolver contextResolver;
-
-    /**
      * Sets up the test.
      */
     @Before
     public void setUp() {
         applicationContext = createMock(ApplicationContext.class);
         applicationScope = new HashMap<String, Object>();
-        contextResolver = createMock(ContextResolver.class);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, contextResolver);
         request = createMockBuilder(AbstractClientRequest.class)
                 .withConstructor(applicationContext).createMock();
 
@@ -81,15 +74,14 @@
     public void testDispatch() throws IOException {
         Map<String, Object> requestScope = new HashMap<String, Object>();
 
-        expect(contextResolver.getContext(request, "request")).andReturn(
-                requestScope).anyTimes();
+        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
         request.doForward("/my/path.html");
         request.doInclude("/my/path2.html");
 
-        replay(request, applicationContext, contextResolver);
+        replay(request, applicationContext);
         request.dispatch("/my/path.html");
         request.dispatch("/my/path2.html");
-        verify(request, applicationContext, contextResolver);
+        verify(request, applicationContext);
     }
 
     /**
@@ -100,14 +92,13 @@
     public void testInclude() throws IOException {
         Map<String, Object> requestScope = new HashMap<String, Object>();
 
-        expect(contextResolver.getContext(request, "request")).andReturn(
-                requestScope).anyTimes();
+        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
         request.doInclude("/my/path2.html");
 
-        replay(request, applicationContext, contextResolver);
+        replay(request, applicationContext);
         request.include("/my/path2.html");
-        assertTrue((Boolean) requestScope.get(AbstractRequest.FORCE_INCLUDE_ATTRIBUTE_NAME));
-        verify(request, applicationContext, contextResolver);
+        assertTrue((Boolean)request.getContext("request").get(AbstractRequest.FORCE_INCLUDE_ATTRIBUTE_NAME));
+        verify(request, applicationContext);
     }
 
     /**
@@ -115,9 +106,9 @@
      */
     @Test
     public void testGetApplicationContext() {
-        replay(request, applicationContext, contextResolver);
+        replay(request, applicationContext);
         assertEquals(applicationContext, request.getApplicationContext());
-        verify(request, applicationContext, contextResolver);
+        verify(request, applicationContext);
     }
 
     /**
@@ -128,11 +119,11 @@
     public void testGetContext() {
         Map<String, Object> scope = createMock(Map.class);
 
-        expect(contextResolver.getContext(request, "myScope")).andReturn(scope);
+        expect(request.getContext("myScope")).andReturn(scope);
 
-        replay(request, applicationContext, contextResolver, scope);
+        replay(request, applicationContext, scope);
         assertEquals(scope, request.getContext("myScope"));
-        verify(request, applicationContext, contextResolver, scope);
+        verify(request, applicationContext, scope);
     }
 
     /**
@@ -142,11 +133,11 @@
     public void testGetAvailableScopes() {
         String[] scopes = new String[] {"one", "two", "three"};
 
-        expect(contextResolver.getAvailableScopes(request)).andReturn(scopes);
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList(scopes));
 
-        replay(request, applicationContext, contextResolver);
-        assertArrayEquals(scopes, request.getAvailableScopes());
-        verify(request, applicationContext, contextResolver);
+        replay(request, applicationContext);
+        assertArrayEquals(scopes, request.getAvailableScopes().toArray());
+        verify(request, applicationContext);
     }
 
     /**
@@ -154,9 +145,9 @@
      */
     @Test
     public void testGetApplicationScope() {
-        replay(request, applicationContext, contextResolver);
+        replay(request, applicationContext);
         assertEquals(applicationScope, request.getApplicationScope());
-        verify(request, applicationContext, contextResolver);
+        verify(request, applicationContext);
     }
 
 }
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractViewRequestTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractViewRequestTest.java
index 26e3a30..283648d 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractViewRequestTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/AbstractViewRequestTest.java
@@ -27,7 +27,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.tiles.request.scope.ContextResolver;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -54,11 +53,6 @@
     private ApplicationContext applicationContext;
 
     /**
-     * The context resolver.
-     */
-    private ContextResolver contextResolver;
-
-    /**
      * The application scope.
      */
     private Map<String, Object> applicationScope;
@@ -73,8 +67,6 @@
                 wrappedRequest).createMock();
         applicationContext = createMock(ApplicationContext.class);
         applicationScope = new HashMap<String, Object>();
-        contextResolver = createMock(ContextResolver.class);
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, contextResolver);
 
         expect(wrappedRequest.getApplicationContext()).andReturn(applicationContext).anyTimes();
         expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
@@ -88,13 +80,13 @@
     public void testDispatch() throws IOException {
         Map<String, Object> requestScope = new HashMap<String, Object>();
 
-        expect(contextResolver.getContext(isA(Request.class), eq("request"))).andReturn(requestScope);
+        expect(request.getContext("request")).andReturn(requestScope);
         wrappedRequest.include("/my/path.html");
 
-        replay(wrappedRequest, request, applicationContext, contextResolver);
+        replay(wrappedRequest, request, applicationContext);
         request.dispatch("/my/path.html");
         assertTrue((Boolean) requestScope.get(AbstractRequest.FORCE_INCLUDE_ATTRIBUTE_NAME));
-        verify(wrappedRequest, request, applicationContext, contextResolver);
+        verify(wrappedRequest, request, applicationContext);
     }
 
     /**
@@ -105,13 +97,13 @@
     public void testInclude() throws IOException {
         Map<String, Object> requestScope = new HashMap<String, Object>();
 
-        expect(contextResolver.getContext(isA(Request.class), eq("request"))).andReturn(requestScope);
+        expect(request.getContext("request")).andReturn(requestScope);
         wrappedRequest.include("/my/path.html");
 
-        replay(wrappedRequest, request, applicationContext, contextResolver);
+        replay(wrappedRequest, request, applicationContext);
         request.include("/my/path.html");
         assertTrue((Boolean) requestScope.get(AbstractRequest.FORCE_INCLUDE_ATTRIBUTE_NAME));
-        verify(wrappedRequest, request, applicationContext, contextResolver);
+        verify(wrappedRequest, request, applicationContext);
     }
 
     /**
@@ -122,9 +114,9 @@
     public void testDoInclude() throws IOException {
         wrappedRequest.include("/my/path.html");
 
-        replay(wrappedRequest, request, applicationContext, contextResolver);
+        replay(wrappedRequest, request, applicationContext);
         request.doInclude("/my/path.html");
-        verify(wrappedRequest, request, applicationContext, contextResolver);
+        verify(wrappedRequest, request, applicationContext);
     }
 
 }
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationAccessTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationAccessTest.java
index 5ca56c2..4d4de4c 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationAccessTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationAccessTest.java
@@ -20,14 +20,11 @@
  */
 package org.apache.tiles.request;
 
-import org.apache.tiles.request.ApplicationAccess;
 import static org.junit.Assert.*;
 import static org.easymock.EasyMock.*;
 
 import java.util.Map;
 
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.scope.ContextResolver;
 import org.junit.Test;
 
 /**
@@ -55,42 +52,4 @@
         verify(applicationContext, applicationScope);
     }
 
-    /**
-     * Test method for {@link ApplicationAccess#registerContextResolver(ContextResolver, ApplicationContext)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRegisterContextResolver() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> applicationScope = createMock(Map.class);
-        ContextResolver contextResolver = createMock(ContextResolver.class);
-
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(applicationScope.put(ApplicationAccess
-                .CONTEXT_RESOLVER_ATTRIBUTE, contextResolver)).andReturn(null);
-
-        replay(applicationContext, applicationScope, contextResolver);
-        ApplicationAccess.registerContextResolver(contextResolver, applicationContext);
-        verify(applicationContext, applicationScope, contextResolver);
-    }
-
-    /**
-     * Test method for {@link ApplicationAccess#getContextResolver(ApplicationContext)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetContextResolver() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> applicationScope = createMock(Map.class);
-        ContextResolver contextResolver = createMock(ContextResolver.class);
-
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(applicationScope.get(ApplicationAccess
-                .CONTEXT_RESOLVER_ATTRIBUTE)).andReturn(contextResolver);
-
-        replay(applicationContext, applicationScope, contextResolver);
-        assertEquals(contextResolver, ApplicationAccess.getContextResolver(applicationContext));
-        verify(applicationContext, applicationScope, contextResolver);
-    }
-
 }
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationContextWrapperTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationContextWrapperTest.java
index 4f896f6..4eabedb 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationContextWrapperTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/ApplicationContextWrapperTest.java
@@ -20,7 +20,6 @@
  */
 package org.apache.tiles.request;
 
-import org.apache.tiles.request.ApplicationContextWrapper;
 import static org.easymock.EasyMock.*;
 import static org.easymock.classextension.EasyMock.*;
 import static org.junit.Assert.*;
@@ -30,7 +29,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.tiles.request.ApplicationContext;
 import org.junit.Test;
 
 /**
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DefaultRequestWrapperTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DefaultRequestWrapperTest.java
index 90e4a55..58b7439 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DefaultRequestWrapperTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DefaultRequestWrapperTest.java
@@ -20,9 +20,6 @@
  */
 package org.apache.tiles.request;
 
-import org.apache.tiles.request.RequestWrapper;
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.request.DefaultRequestWrapper;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.classextension.EasyMock.createMock;
 import static org.easymock.classextension.EasyMock.replay;
@@ -36,13 +33,11 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Arrays;
 import java.util.Locale;
 import java.util.Map;
 
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
 import org.apache.tiles.request.attribute.Addable;
-import org.apache.tiles.request.scope.ContextResolver;
 import org.junit.Test;
 
 /**
@@ -145,20 +140,14 @@
     public void testGetContext() {
         Request wrappedRequest = createMockRequest();
         Map<String, Object> context = createMock(Map.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
-        Map<String, Object> applicationScope = createMock(Map.class);
 
         RequestWrapper request = createRequestWrapper(wrappedRequest);
 
-        expect(wrappedRequest.getApplicationContext()).andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(applicationScope.get(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE)).andReturn(resolver);
-        expect(resolver.getContext(request, "one")).andReturn(context);
+        expect(wrappedRequest.getContext("one")).andReturn(context);
 
-        replay(wrappedRequest, context, applicationContext, resolver, applicationScope);
+        replay(wrappedRequest, context);
         assertEquals(context, request.getContext("one"));
-        verify(wrappedRequest, context, applicationContext, resolver, applicationScope);
+        verify(wrappedRequest, context);
     }
 
     /**
@@ -170,7 +159,7 @@
 
         replay(wrappedRequest);
         RequestWrapper request = createRequestWrapper(wrappedRequest);
-        assertNull(request.getNativeScopes());
+        assertTrue(0 == request.getNativeScopes().size());
         verify(wrappedRequest);
     }
 
@@ -182,21 +171,15 @@
     public void testGetAvailableScopes() {
         Request wrappedRequest = createMockRequest();
         Map<String, Object> context = createMock(Map.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
-        Map<String, Object> applicationScope = createMock(Map.class);
 
         RequestWrapper request = createRequestWrapper(wrappedRequest);
 
-        expect(wrappedRequest.getApplicationContext()).andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(applicationScope.get(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE)).andReturn(resolver);
         String[] scopes = new String[] {"one", "two", "three"};
-        expect(resolver.getAvailableScopes(request)).andReturn(scopes);
+        expect(wrappedRequest.getAvailableScopes()).andReturn(Arrays.asList(scopes));
 
-        replay(wrappedRequest, context, applicationContext, resolver, applicationScope);
-        assertArrayEquals(scopes, request.getAvailableScopes());
-        verify(wrappedRequest, context, applicationContext, resolver, applicationScope);
+        replay(wrappedRequest, context);
+        assertArrayEquals(scopes, request.getAvailableScopes().toArray());
+        verify(wrappedRequest, context);
     }
 
     /**
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DispatchRequestWrapperTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DispatchRequestWrapperTest.java
index dae1cfc..a9b05ad 100644
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DispatchRequestWrapperTest.java
+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/DispatchRequestWrapperTest.java
@@ -20,15 +20,12 @@
  */
 package org.apache.tiles.request;
 
-import org.apache.tiles.request.DispatchRequestWrapper;
 import static org.easymock.classextension.EasyMock.createMock;
 import static org.easymock.classextension.EasyMock.replay;
 import static org.easymock.classextension.EasyMock.verify;
 
 import java.io.IOException;
 
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.DispatchRequest;
 import org.junit.Test;
 
 /**
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/NoSuchScopeExceptionTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/NoSuchScopeExceptionTest.java
deleted file mode 100644
index e5eceb4..0000000
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/NoSuchScopeExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.tiles.request.scope;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link NoSuchScopeException}.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchScopeExceptionTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.request.scope.NoSuchScopeException#NoSuchScopeException()}.
-     */
-    @Test
-    public void testNoSuchScopeException() {
-        NoSuchScopeException exception = new NoSuchScopeException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchScopeException#NoSuchScopeException(String)}.
-     */
-    @Test
-    public void testNoSuchScopeExceptionString() {
-        NoSuchScopeException exception = new NoSuchScopeException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchScopeException#NoSuchScopeException(Throwable)}.
-     */
-    @Test
-    public void testNoSuchScopeExceptionThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchScopeException exception = new NoSuchScopeException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchScopeException#NoSuchScopeException(String, Throwable)}.
-     */
-    @Test
-    public void testNoSuchScopeExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchScopeException exception = new NoSuchScopeException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java
deleted file mode 100644
index 24ec077..0000000
--- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * $Id$
- *
- * 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.tiles.request.scope;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.attribute.Addable;
-import org.apache.tiles.request.DefaultRequestWrapper;
-import org.apache.tiles.request.RequestWrapper;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ReflectionContextResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class ReflectionContextResolverTest {
-
-    /**
-     * The scopes.
-     */
-    private static final String [] SCOPES = new String[] {"one", "two", "three"};
-
-    /**
-     * The resolver to test.
-     */
-    private ReflectionContextResolver resolver;
-
-    /**
-     * One scope.
-     */
-    private Map<String, Object> oneScope;
-    /**
-     * Two scope.
-     */
-    private Map<String, Object> twoScope;
-    /**
-     * Three scope.
-     */
-    private Map<String, Object> threeScope;
-
-    /**
-     * The request.
-     */
-    private Request request;
-
-    /**
-     * Initializes the test.
-     */
-    @SuppressWarnings("unchecked")
-    @Before
-    public void setUp() {
-        resolver = new ReflectionContextResolver();
-        oneScope = createMock(Map.class);
-        twoScope = createMock(Map.class);
-        threeScope = createMock(Map.class);
-        request = new SampleRequest(oneScope, twoScope, threeScope);
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getContext(org.apache.tiles.request.Request, java.lang.String)}.
-     */
-    @Test
-    public void testGetContext() {
-        replay(oneScope, twoScope, threeScope);
-        assertEquals(oneScope, resolver.getContext(request, "one"));
-        assertEquals(twoScope, resolver.getContext(request, "two"));
-        assertEquals(threeScope, resolver.getContext(request, "three"));
-        verify(oneScope, twoScope, threeScope);
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getContext(org.apache.tiles.request.Request, java.lang.String)}.
-     */
-    @Test
-    public void testGetContextWrapped() {
-        replay(oneScope, twoScope, threeScope);
-        RequestWrapper wrapper = new DefaultRequestWrapper(request);
-        assertEquals(oneScope, resolver.getContext(wrapper, "one"));
-        assertEquals(twoScope, resolver.getContext(wrapper, "two"));
-        assertEquals(threeScope, resolver.getContext(wrapper, "three"));
-        verify(oneScope, twoScope, threeScope);
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getContext(org.apache.tiles.request.Request, java.lang.String)}.
-     */
-    @Test(expected = NoSuchScopeException.class)
-    public void testGetContextException() {
-        resolver.getContext(request, "none");
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getContext(org.apache.tiles.request.Request, java.lang.String)}.
-     */
-    @Test(expected = NoSuchScopeException.class)
-    public void testGetContextException2() {
-        resolver.getContext(request, "private");
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getContext(org.apache.tiles.request.Request, java.lang.String)}.
-     */
-    @Test(expected = NoSuchScopeException.class)
-    public void testGetContextException3() {
-        resolver.getContext(request, "unavailable");
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getAvailableScopes(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testGetAvailableScopes() {
-        replay(oneScope, twoScope, threeScope);
-        assertArrayEquals(SCOPES, resolver.getAvailableScopes(request));
-        verify(oneScope, twoScope, threeScope);
-    }
-
-    /**
-     * Test method for {@link ReflectionContextResolver#getAvailableScopes(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testGetAvailableScopesWrapped() {
-        replay(oneScope, twoScope, threeScope);
-        RequestWrapper wrapper = new DefaultRequestWrapper(request);
-        assertArrayEquals(SCOPES, resolver.getAvailableScopes(wrapper));
-        verify(oneScope, twoScope, threeScope);
-    }
-
-    /**
-     * A sample request.
-     */
-    public static class SampleRequest implements Request {
-
-        /**
-         * The scopes.
-         */
-        private static final String [] SCOPES = new String[] {"one", "two", "three"};
-
-        /**
-         * The scope maps.
-         */
-        private Map<String, Object> oneScope, twoScope, threeScope;
-
-        /**
-         * Constructor.
-         *
-         * @param oneScope Scope one.
-         * @param twoScope Scope two.
-         * @param threeScope Scope three.
-         */
-        public SampleRequest(Map<String, Object> oneScope,
-                Map<String, Object> twoScope, Map<String, Object> threeScope) {
-            this.oneScope = oneScope;
-            this.twoScope = twoScope;
-            this.threeScope = threeScope;
-        }
-
-        @Override
-        public String[] getNativeScopes() {
-            return SCOPES;
-        }
-
-        @Override
-        public String[] getAvailableScopes() {
-            return SCOPES;
-        }
-
-        /**
-         * Returns one scope.
-         *
-         * @return One scope.
-         */
-        public Map<String, Object> getOneScope() {
-            return oneScope;
-        }
-
-        /**
-         * Returns two scope.
-         *
-         * @return Two scope.
-         */
-        public Map<String, Object> getTwoScope() {
-            return twoScope;
-        }
-
-        /**
-         * Returns three scope.
-         *
-         * @return Three scope.
-         */
-        public Map<String, Object> getThreeScope() {
-            return threeScope;
-        }
-
-        /**
-         * Returns a private scope.
-         *
-         * @return A private, unused, scope.
-         */
-        @SuppressWarnings("unused")
-        private Map<String, Object> getPrivateScope() {
-            return null;
-        }
-
-        /**
-         * Returns an unavailable scope.
-         *
-         * @return The unavailable scope, raising exception.
-         */
-        public Map<String, Object> getUnavailableScope() {
-            throw new UnsupportedOperationException("No way!");
-        }
-
-        @Override
-        public ApplicationContext getApplicationContext() {
-            return null;
-        }
-
-        @Override
-        public Map<String, Object> getContext(String scope) {
-            return null;
-        }
-
-        @Override
-        public Map<String, String> getHeader() {
-            return null;
-        }
-
-        @Override
-        public Map<String, String[]> getHeaderValues() {
-            return null;
-        }
-
-        @Override
-        public Addable<String> getResponseHeaders() {
-            return null;
-        }
-
-        @Override
-        public OutputStream getOutputStream() {
-            return null;
-        }
-
-        @Override
-        public Map<String, String> getParam() {
-            return null;
-        }
-
-        @Override
-        public Map<String, String[]> getParamValues() {
-            return null;
-        }
-
-        @Override
-        public PrintWriter getPrintWriter() {
-            return null;
-        }
-
-        @Override
-        public Locale getRequestLocale() {
-            return null;
-        }
-
-        @Override
-        public Writer getWriter() {
-            return null;
-        }
-
-        @Override
-        public boolean isResponseCommitted() {
-            return false;
-        }
-
-        @Override
-        public boolean isUserInRole(String role) {
-            return false;
-        }
-    }
-}
diff --git a/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/request/freemarker/FreemarkerRequest.java b/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/request/freemarker/FreemarkerRequest.java
index 883ac26..8812882 100644
--- a/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/request/freemarker/FreemarkerRequest.java
+++ b/tiles-request/tiles-request-freemarker/src/main/java/org/apache/tiles/request/freemarker/FreemarkerRequest.java
@@ -23,6 +23,8 @@
 
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -48,7 +50,7 @@
     /**
      * The natively available scopes. In fact, only "page".
      */
-    private static final String[] SCOPES = {"page"};
+    private static final List<String> SCOPES = Collections.singletonList("page");
 
     /**
      * The FreeMarker current environment.
@@ -121,7 +123,7 @@
     }
 
     @Override
-    public String[] getNativeScopes() {
+    public List<String> getNativeScopes() {
         return SCOPES;
     }
 
@@ -140,4 +142,10 @@
     public Writer getWriter() {
         return env.getOut();
     }
+
+    @Override
+    public Map<String, Object> getContext(String scope) {
+        return "page".equals(scope) ? getPageScope() : super.getContext(scope);
+    }
+
 }
diff --git a/tiles-request/tiles-request-freemarker/src/test/java/org/apache/tiles/request/freemarker/FreemarkerRequestTest.java b/tiles-request/tiles-request-freemarker/src/test/java/org/apache/tiles/request/freemarker/FreemarkerRequestTest.java
index 0b20632..972456c 100644
--- a/tiles-request/tiles-request-freemarker/src/test/java/org/apache/tiles/request/freemarker/FreemarkerRequestTest.java
+++ b/tiles-request/tiles-request-freemarker/src/test/java/org/apache/tiles/request/freemarker/FreemarkerRequestTest.java
@@ -38,7 +38,6 @@
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.DispatchRequest;
-import org.apache.tiles.request.scope.ContextResolver;
 import org.apache.tiles.request.servlet.ServletRequest;
 import org.apache.tiles.request.ApplicationAccess;
 import org.junit.Before;
@@ -135,20 +134,14 @@
         String path = "this way";
         DispatchRequest enclosedRequest = createMock(DispatchRequest.class);
         ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ContextResolver resolver = createMock(ContextResolver.class);
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
         Map<String, Object> requestScope = new HashMap<String, Object>();
-        applicationScope.put(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE, resolver);
 
         enclosedRequest.include(path);
-        expect(enclosedRequest.getApplicationContext()).andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        replay(enclosedRequest, applicationContext);
         context = new FreemarkerRequest(enclosedRequest, env);
-        expect(resolver.getContext(isA(Request.class), eq("request"))).andReturn(requestScope);
-        replay(resolver);
+        expect(enclosedRequest.getContext("request")).andReturn(requestScope);
+        replay(enclosedRequest, applicationContext);
         context.dispatch(path);
-        verify(enclosedRequest, applicationContext, resolver);
+        verify(enclosedRequest, applicationContext);
     }
 
     /**
@@ -171,7 +164,7 @@
         DispatchRequest enclosedRequest = createMock(DispatchRequest.class);
         replay(enclosedRequest);
         context = new FreemarkerRequest(enclosedRequest, env);
-        assertArrayEquals(new String[] {"page"}, context.getNativeScopes());
+        assertArrayEquals(new String[] {"page"}, context.getNativeScopes().toArray());
         verify(enclosedRequest);
     }
 
diff --git a/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/request/jsp/JspRequest.java b/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/request/jsp/JspRequest.java
index bfc5a86..f3bb0ae 100644
--- a/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/request/jsp/JspRequest.java
+++ b/tiles-request/tiles-request-jsp/src/main/java/org/apache/tiles/request/jsp/JspRequest.java
@@ -23,6 +23,9 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletException;
@@ -50,7 +53,8 @@
     /**
      * The native available scopes.
      */
-    private static final String[] SCOPES = {"page", "request", "session", "application"};
+    private static final List<String> SCOPES
+            = Collections.unmodifiableList(Arrays.asList("page", "request", "session", "application"));
 
     /**
      * The current page context.
@@ -108,7 +112,7 @@
     }
 
     @Override
-    public String[] getNativeScopes() {
+    public List<String> getNativeScopes() {
         return SCOPES;
     }
 
@@ -194,4 +198,18 @@
     public PageContext getPageContext() {
         return pageContext;
     }
+
+    @Override
+    public Map<String, Object> getContext(String scope) {
+        if("page".equals(scope)){
+            return getPageScope();
+        }else if("request".equals(scope)){
+            return getRequestScope();
+        }else if("session".equals(scope)){
+            return getSessionScope();
+        }else if("application".equals(scope)){
+            return getApplicationScope();
+        }
+        throw new IllegalArgumentException(scope + " does not exist. Call getAvailableScopes() first to check.");
+    }
 }
diff --git a/tiles-request/tiles-request-jsp/src/test/java/org/apache/tiles/request/jsp/JspRequestTest.java b/tiles-request/tiles-request-jsp/src/test/java/org/apache/tiles/request/jsp/JspRequestTest.java
index 1b44242..ea7e907 100644
--- a/tiles-request/tiles-request-jsp/src/test/java/org/apache/tiles/request/jsp/JspRequestTest.java
+++ b/tiles-request/tiles-request-jsp/src/test/java/org/apache/tiles/request/jsp/JspRequestTest.java
@@ -78,7 +78,7 @@
     public void testGetNativeScopes() {
         replay(context, enclosedRequest);
         assertArrayEquals(new String[] { "page", "request", "session",
-                "application" }, request.getNativeScopes());
+                "application" }, request.getNativeScopes().toArray());
         verify(context, enclosedRequest);
     }
 
diff --git a/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java b/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
index 2201574..fae7d42 100644
--- a/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
+++ b/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
@@ -24,6 +24,9 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -55,7 +58,8 @@
     /**
      * The native available scopes.
      */
-    private static final String[] SCOPES = {"request", "portletSession", "session", "application"};
+    private static final List<String> SCOPES
+            = Collections.unmodifiableList(Arrays.asList("request", "portletSession", "session", "application"));
 
     /**
      * <p>The lazily instantiated <code>Map</code> of header name-value
@@ -226,7 +230,7 @@
     }
 
     @Override
-    public String[] getNativeScopes() {
+    public List<String> getNativeScopes() {
         return SCOPES;
     }
 
@@ -317,4 +321,18 @@
                     + path + "'.", e);
         }
     }
+
+    @Override
+    public Map<String, Object> getContext(String scope) {
+        if("request".equals(scope)){
+            return getRequestScope();
+        }else if("application".equals(scope)){
+            return getApplicationScope();
+        }else if("portletSession".equals(scope)){
+            return getPortletSessionScope();
+        }else if("application".equals(scope)){
+            return getApplicationScope();
+        }
+        throw new IllegalArgumentException(scope + " does not exist. Call getAvailableScopes() first to check.");
+    }
 }
diff --git a/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java b/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
index 37cbc29..d0c953a 100644
--- a/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
+++ b/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
@@ -315,7 +315,7 @@
     @Test
     public void testGetNativeScopes() {
         assertArrayEquals(new String[] { "request", "portletSession",
-                "session", "application" }, req.getNativeScopes());
+                "session", "application" }, req.getNativeScopes().toArray());
     }
 
     /**
diff --git a/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java b/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
index 83afdad..3e95339 100644
--- a/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
+++ b/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
@@ -24,6 +24,9 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -53,7 +56,8 @@
     /**
      * The native available scopes: request, session and application.
      */
-    private static final String[] SCOPES = {"request", "session", "application"};
+    private static final List<String> SCOPES
+            = Collections.unmodifiableList(Arrays.asList("request", "session", "application"));
 
     /**
      * The request object to use.
@@ -179,6 +183,17 @@
         return request.getParameterMap();
     }
 
+    @Override
+    public Map<String, Object> getContext(String scope) {
+        if("request".equals(scope)){
+            return getRequestScope();
+        }else if("session".equals(scope)){
+            return getSessionScope();
+        }else if("application".equals(scope)){
+            return getApplicationScope();
+        }
+        throw new IllegalArgumentException(scope + " does not exist. Call getAvailableScopes() first to check.");
+    }
 
     /** {@inheritDoc} */
     public Map<String, Object> getRequestScope() {
@@ -202,7 +217,7 @@
     }
 
     @Override
-    public String[] getNativeScopes() {
+    public List<String> getNativeScopes() {
         return SCOPES;
     }
 
@@ -291,12 +306,10 @@
         return request.getLocale();
     }
 
-    /** {@inheritDoc} */
     public HttpServletRequest getRequest() {
         return request;
     }
 
-    /** {@inheritDoc} */
     public HttpServletResponse getResponse() {
         return response;
     }
diff --git a/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java b/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
index 00b41c6..809de57 100644
--- a/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
+++ b/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
@@ -278,7 +278,7 @@
      */
     @Test
     public void testGetNativeScopes() {
-        assertArrayEquals(new String[] {"request", "session", "application"}, req.getNativeScopes());
+        assertArrayEquals(new String[] {"request", "session", "application"}, req.getNativeScopes().toArray());
     }
 
     /**
diff --git a/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/request/velocity/VelocityRequest.java b/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/request/velocity/VelocityRequest.java
index 6b165c5..cd3bd54 100644
--- a/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/request/velocity/VelocityRequest.java
+++ b/tiles-request/tiles-request-velocity/src/main/java/org/apache/tiles/request/velocity/VelocityRequest.java
@@ -24,6 +24,8 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.RequestDispatcher;
@@ -50,7 +52,7 @@
     /**
      * The native available scopes, in fact only "page".
      */
-    private static final String[] SCOPES = {"page"};
+    private static final List<String> SCOPES = Collections.singletonList("page");
 
     /**
      * The Velocity current context.
@@ -103,7 +105,7 @@
     }
 
     @Override
-    public String[] getNativeScopes() {
+    public List<String> getNativeScopes() {
         return SCOPES;
     }
 
@@ -164,4 +166,10 @@
         }
         return pageScope;
     }
+
+    @Override
+    public Map<String, Object> getContext(String scope) {
+        return "page".equals(scope) ? getPageScope() : super.getContext(scope);
+    }
+
 }
diff --git a/tiles-request/tiles-request-velocity/src/test/java/org/apache/tiles/request/velocity/VelocityRequestTest.java b/tiles-request/tiles-request-velocity/src/test/java/org/apache/tiles/request/velocity/VelocityRequestTest.java
index 6c4979e..70d8fb8 100644
--- a/tiles-request/tiles-request-velocity/src/test/java/org/apache/tiles/request/velocity/VelocityRequestTest.java
+++ b/tiles-request/tiles-request-velocity/src/test/java/org/apache/tiles/request/velocity/VelocityRequestTest.java
@@ -98,7 +98,7 @@
         DispatchRequest enclosedRequest = createMock(DispatchRequest.class);
         replay(enclosedRequest);
         context = new VelocityRequest(enclosedRequest, velocityContext, writer);
-        assertArrayEquals(new String[] {"page"}, context.getNativeScopes());
+        assertArrayEquals(new String[] {"page"}, context.getNativeScopes().toArray());
         verify(enclosedRequest);
     }