diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
index c7bc3f0..fa3d929 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
@@ -61,6 +61,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -98,6 +99,12 @@
    * Encapsulates all state contained by the AbstractRequestContext.
    */
   protected static class State {
+    /**
+     * Supports the case where chained contexts are used and a response comes
+     * back from the server with a proxy type not reachable from the canonical
+     * context.
+     */
+    public Set<AbstractRequestContext> appendedContexts;
     public final AbstractRequestContext canonical;
     public final DialectImpl dialect;
     public FanoutReceiver<Void> fanout;
@@ -137,8 +144,19 @@
     public State(AbstractRequestFactory requestFactory, DialectImpl dialect,
         AbstractRequestContext canonical) {
       this.requestFactory = requestFactory;
-      this.dialect = dialect;
       this.canonical = canonical;
+      this.dialect = dialect;
+    }
+
+    public void addContext(AbstractRequestContext ctx) {
+      if (appendedContexts == null) {
+        appendedContexts = Collections.singleton(ctx);
+      } else {
+        if (appendedContexts.size() == 1) {
+          appendedContexts = new LinkedHashSet<AbstractRequestContext>(appendedContexts);
+        }
+        appendedContexts.add(ctx);
+      }
     }
 
     public AbstractRequestContext getCanonicalContext() {
@@ -231,7 +249,7 @@
           (Class<BaseProxy>) state.invocations.get(0).getRequestData().getReturnType();
 
       SimpleProxyId<BaseProxy> id = getRequestFactory().allocateId(target);
-      AutoBean<BaseProxy> bean = createProxy(target, id);
+      AutoBean<BaseProxy> bean = createProxy(target, id, true);
       // XXX expose this as a proper API
       ((AbstractAutoBean<?>) bean).setData(result);
       // AutoBeanCodex.decodeInto(result, bean);
@@ -453,7 +471,7 @@
   private State state;
 
   protected AbstractRequestContext(AbstractRequestFactory factory, Dialect dialect) {
-    this.state = new State(factory, dialect.create(this), this);
+    setState(new State(factory, dialect.create(this), this));
   }
 
   public <T extends RequestContext> T append(T other) {
@@ -465,7 +483,7 @@
     if (!child.state.isClean()) {
       throw new IllegalStateException("The provided RequestContext has been changed");
     }
-    child.state = state;
+    child.setState(state);
     return other;
   }
 
@@ -476,22 +494,10 @@
     checkLocked();
 
     SimpleProxyId<T> id = state.requestFactory.allocateId(clazz);
-    AutoBean<T> created = createProxy(clazz, id);
+    AutoBean<T> created = createProxy(clazz, id, false);
     return takeOwnership(created);
   }
 
-  /**
-   * Creates a new proxy with an assigned ID.
-   */
-  public <T extends BaseProxy> AutoBean<T> createProxy(Class<T> clazz, SimpleProxyId<T> id) {
-    AutoBean<T> created = getAutoBeanFactory().create(clazz);
-    if (created == null) {
-      throw new IllegalArgumentException("Unknown proxy type " + clazz.getName());
-    }
-    created.setTag(STABLE_ID, id);
-    return created;
-  }
-
   public <T extends BaseProxy> T edit(T object) {
     return editProxy(object);
   }
@@ -532,8 +538,8 @@
       @Override
       protected RequestData makeRequestData() {
         // This method is normally generated, hence the ugly constructor
-        return new RequestData(Constants.FIND_METHOD_OPERATION,
-            new Object[] {proxyId}, propertyRefs, proxyId.getProxyClass(), null);
+        return new RequestData(Constants.FIND_METHOD_OPERATION, new Object[] {proxyId},
+            propertyRefs, proxyId.getProxyClass(), null);
       }
     };
   }
@@ -642,7 +648,7 @@
    */
   public boolean isValueType(Class<?> clazz) {
     return state.requestFactory.isValueType(clazz);
-  };
+  }
 
   public void setFireDisabled(boolean disabled) {
     state.fireDisabled = disabled;
@@ -653,6 +659,39 @@
    */
   protected void addInvocation(AbstractRequest<?> request) {
     state.dialect.addInvocation(request);
+  };
+
+  /**
+   * Creates a new proxy with an assigned ID.
+   * 
+   * @param clazz The proxy type
+   * @param id The id to be assigned to the new proxy
+   * @param useAppendedContexts if {@code true} use the AutoBeanFactory types
+   *          associated with any contexts that have been passed into
+   *          {@link #append(RequestContext)}. If {@code false}, this method
+   *          will only create proxy types reachable from the implemented
+   *          RequestContext interface.
+   * @throws IllegalArgumentException if the requested proxy type cannot be
+   *           created
+   */
+  protected <T extends BaseProxy> AutoBean<T> createProxy(Class<T> clazz, SimpleProxyId<T> id,
+      boolean useAppendedContexts) {
+    AutoBean<T> created = null;
+    if (useAppendedContexts) {
+      for (AbstractRequestContext ctx : state.appendedContexts) {
+        created = ctx.getAutoBeanFactory().create(clazz);
+        if (created != null) {
+          break;
+        }
+      }
+    } else {
+      created = getAutoBeanFactory().create(clazz);
+    }
+    if (created != null) {
+      created.setTag(STABLE_ID, id);
+      return created;
+    }
+    throw new IllegalArgumentException("Unknown proxy type " + clazz.getName());
   }
 
   /**
@@ -747,7 +786,7 @@
     AutoBean<Q> bean = (AutoBean<Q>) state.returnedProxies.get(id);
     if (bean == null) {
       Class<Q> proxyClass = id.getProxyClass();
-      bean = createProxy(proxyClass, id);
+      bean = createProxy(proxyClass, id, true);
       state.returnedProxies.put(id, bean);
     }
 
@@ -770,7 +809,7 @@
     AutoBean<?> parent;
     if (stableId.isEphemeral()) {
       // Newly-created object, use a blank object to compare against
-      parent = createProxy(stableId.getProxyClass(), stableId);
+      parent = createProxy(stableId.getProxyClass(), stableId, true);
 
       // Newly-created objects go into the persist operation bucket
       operation.setOperation(WriteOperation.PERSIST);
@@ -779,7 +818,7 @@
       operation.setStrength(Strength.EPHEMERAL);
     } else if (stableId.isSynthetic()) {
       // Newly-created object, use a blank object to compare against
-      parent = createProxy(stableId.getProxyClass(), stableId);
+      parent = createProxy(stableId.getProxyClass(), stableId, true);
 
       // Newly-created objects go into the persist operation bucket
       operation.setOperation(WriteOperation.PERSIST);
@@ -1200,6 +1239,11 @@
     state.locked = false;
   }
 
+  private void setState(State state) {
+    this.state = state;
+    state.addContext(this);
+  }
+
   /**
    * Make the EnityProxy bean edited and owned by this RequestContext.
    */
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestContext.java b/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestContext.java
index ae23ac2..6dcedca 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestContext.java
@@ -203,9 +203,10 @@
   }
 
   @Override
-  public <T extends BaseProxy> AutoBean<T> createProxy(Class<T> clazz, SimpleProxyId<T> id) {
+  protected <T extends BaseProxy> AutoBean<T> createProxy(Class<T> clazz, SimpleProxyId<T> id,
+      boolean useAppendedContexts) {
     if (tokenResolver.isReferencedType(clazz.getName())) {
-      return super.createProxy(clazz, id);
+      return super.createProxy(clazz, id, useAppendedContexts);
     }
     throw new IllegalArgumentException("Unknown proxy type " + clazz.getName());
   }
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
index fbe2f56..7062b9c 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
@@ -18,6 +18,7 @@
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.web.bindery.requestfactory.gwt.client.RequestBatcherTest;
 import com.google.web.bindery.requestfactory.gwt.client.FindServiceTest;
+import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryChainedContextTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryExceptionHandlerTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryExceptionPropagationTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryPolymorphicTest;
@@ -47,6 +48,7 @@
     suite.addTestSuite(FindServiceTest.class);
     suite.addTestSuite(LocatorTest.class);
     suite.addTestSuite(RequestFactoryTest.class);
+    suite.addTestSuite(RequestFactoryChainedContextTest.class);
     suite.addTestSuite(RequestFactoryExceptionHandlerTest.class);
     suite.addTestSuite(RequestFactoryExceptionPropagationTest.class);
     suite.addTestSuite(RequestFactoryPolymorphicTest.class);
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryChainedContextTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryChainedContextTest.java
new file mode 100644
index 0000000..4606883
--- /dev/null
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryChainedContextTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed 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 com.google.web.bindery.requestfactory.gwt.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.web.bindery.event.shared.SimpleEventBus;
+import com.google.web.bindery.requestfactory.shared.ProxyFor;
+import com.google.web.bindery.requestfactory.shared.Receiver;
+import com.google.web.bindery.requestfactory.shared.Request;
+import com.google.web.bindery.requestfactory.shared.RequestContext;
+import com.google.web.bindery.requestfactory.shared.RequestFactory;
+import com.google.web.bindery.requestfactory.shared.Service;
+import com.google.web.bindery.requestfactory.shared.SimpleBarProxy;
+import com.google.web.bindery.requestfactory.shared.SimpleBarRequest;
+import com.google.web.bindery.requestfactory.shared.SimpleFooProxy;
+import com.google.web.bindery.requestfactory.shared.SimpleFooRequest;
+import com.google.web.bindery.requestfactory.shared.ValueProxy;
+
+/**
+ * Tests various aspects of how {@code RequestContext.append()} behaves.
+ */
+public class RequestFactoryChainedContextTest extends RequestFactoryTestBase {
+  /**
+   * A RequestFactory where the contained RequestContext types have disjoint
+   * reachable proxy types.
+   */
+  protected interface Factory extends RequestFactory {
+    ACtx a();
+
+    BCtx b();
+  }
+
+  /**
+   * Mandatory javadoc comment.
+   */
+  public static class A {
+    public static A a() {
+      return new A();
+    }
+  }
+
+  @Service(A.class)
+  interface ACtx extends RequestContext {
+    Request<AProxy> a();
+  }
+
+  @ProxyFor(A.class)
+  interface AProxy extends ValueProxy {
+  }
+
+  /**
+   * Mandatory javadoc comment.
+   */
+  public static class B {
+    public static B b() {
+      return new B();
+    }
+  }
+
+  @Service(B.class)
+  interface BCtx extends RequestContext {
+    Request<BProxy> b();
+  }
+
+  @ProxyFor(B.class)
+  interface BProxy extends ValueProxy {
+  }
+
+  private static final int DELAY_TEST_FINISH = 5000;
+
+  @Override
+  public String getModuleName() {
+    return "com.google.web.bindery.requestfactory.gwt.RequestFactorySuite";
+  }
+
+  /**
+   * Basic functional test of the append method.
+   */
+  public void testAppend() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    SimpleFooRequest fooCtx1 = req.simpleFooRequest();
+    SimpleFooProxy foo1 = fooCtx1.create(SimpleFooProxy.class);
+    SimpleBarRequest barCtx = fooCtx1.append(req.simpleBarRequest());
+    SimpleFooRequest fooCtx2 = barCtx.append(req.simpleFooRequest());
+
+    assertNotSame(fooCtx1, fooCtx2);
+    assertSame(foo1, barCtx.edit(foo1));
+    assertSame(foo1, fooCtx2.edit(foo1));
+
+    SimpleBarProxy foo2 = barCtx.create(SimpleBarProxy.class);
+    assertSame(foo2, fooCtx1.edit(foo2));
+    assertSame(foo2, fooCtx2.edit(foo2));
+
+    SimpleFooProxy foo3 = fooCtx2.create(SimpleFooProxy.class);
+    assertSame(foo3, fooCtx1.edit(foo3));
+    assertSame(foo3, barCtx.edit(foo3));
+
+    try {
+      // Throws exception because c3 has already accumulated some state
+      req.simpleValueContext().append(fooCtx2);
+      fail("Should have thrown IllegalStateException");
+    } catch (IllegalStateException expected) {
+    }
+
+    try {
+      // Throws exception because a different RequestFactory instance is used
+      fooCtx2.append(createFactory().simpleFooRequest());
+      fail("Should have thrown IllegalStateException");
+    } catch (IllegalStateException expected) {
+    }
+
+    // Queue up two invocations, and test that both Receivers are called
+    final boolean[] seen = {false, false};
+    fooCtx1.add(1, 2).to(new Receiver<Integer>() {
+      @Override
+      public void onSuccess(Integer response) {
+        seen[0] = true;
+        assertEquals(3, response.intValue());
+      }
+    });
+    barCtx.countSimpleBar().to(new Receiver<Long>() {
+      @Override
+      public void onSuccess(Long response) {
+        seen[1] = true;
+        assertEquals(2, response.longValue());
+      }
+    });
+
+    // It doesn't matter which context instance is fired
+    barCtx.fire(new Receiver<Void>() {
+      @Override
+      public void onSuccess(Void response) {
+        assertTrue(seen[0]);
+        assertTrue(seen[1]);
+        finishTestAndReset();
+      }
+    });
+
+    /*
+     * Since the common State has been locked, calling any other
+     * context-mutation methods should fail.
+     */
+    try {
+      fooCtx1.fire();
+      fail("Should have thrown exception");
+    } catch (IllegalStateException expected) {
+    }
+    try {
+      fooCtx2.fire();
+      fail("Should have thrown exception");
+    } catch (IllegalStateException expected) {
+    }
+    try {
+      fooCtx2.create(SimpleFooProxy.class);
+      fail("Should have thrown exception");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  /**
+   * Ensure that a method invoked on an appended context can result in the
+   * creation of a proxy not reachable from canonical context.
+   */
+  public void testChainedProxyInstantiation() {
+    delayTestFinish(DELAY_TEST_FINISH);
+    Factory f = createChainedFactory();
+
+    ACtx aCtx = f.a();
+    checkReachableTypes(aCtx, AProxy.class, BProxy.class);
+
+    RequestContext ctx = aCtx.a().to(new Receiver<AProxy>() {
+      @Override
+      public void onSuccess(AProxy response) {
+        assertNotNull(response);
+      }
+    });
+
+    BCtx bCtx = ctx.append(f.b());
+    checkReachableTypes(aCtx, AProxy.class, BProxy.class);
+    checkReachableTypes(bCtx, BProxy.class, AProxy.class);
+
+    bCtx.b().to(new Receiver<BProxy>() {
+      @Override
+      public void onSuccess(BProxy response) {
+        assertNotNull(response);
+      }
+    });
+    ctx.fire(new Receiver<Void>() {
+      @Override
+      public void onSuccess(Void response) {
+        finishTest();
+      }
+    });
+  }
+
+  protected Factory createChainedFactory() {
+    Factory f = GWT.create(Factory.class);
+    f.initialize(new SimpleEventBus());
+    return f;
+  }
+}
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
index 9bcbc55..f9935a4 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
@@ -242,87 +242,6 @@
         });
   }
 
-  public void testAppend() {
-    delayTestFinish(DELAY_TEST_FINISH);
-    SimpleFooRequest c1 = req.simpleFooRequest();
-    SimpleFooProxy foo1 = c1.create(SimpleFooProxy.class);
-    SimpleBarRequest c2 = c1.append(req.simpleBarRequest());
-    SimpleFooRequest c3 = c2.append(req.simpleFooRequest());
-
-    assertNotSame(c1, c3);
-    assertSame(foo1, c2.edit(foo1));
-    assertSame(foo1, c3.edit(foo1));
-
-    SimpleBarProxy foo2 = c2.create(SimpleBarProxy.class);
-    assertSame(foo2, c1.edit(foo2));
-    assertSame(foo2, c3.edit(foo2));
-
-    SimpleFooProxy foo3 = c3.create(SimpleFooProxy.class);
-    assertSame(foo3, c1.edit(foo3));
-    assertSame(foo3, c2.edit(foo3));
-
-    try {
-      // Throws exception because c3 has already accumulated some state
-      req.simpleValueContext().append(c3);
-      fail("Should have thrown IllegalStateException");
-    } catch (IllegalStateException expected) {
-    }
-
-    try {
-      // Throws exception because a different RequestFactory instance is used
-      c3.append(createFactory().simpleFooRequest());
-      fail("Should have thrown IllegalStateException");
-    } catch (IllegalStateException expected) {
-    }
-
-    // Queue up two invocations, and test that both Receivers are called
-    final boolean[] seen = {false, false};
-    c1.add(1, 2).to(new Receiver<Integer>() {
-      @Override
-      public void onSuccess(Integer response) {
-        seen[0] = true;
-        assertEquals(3, response.intValue());
-      }
-    });
-    c2.countSimpleBar().to(new Receiver<Long>() {
-      @Override
-      public void onSuccess(Long response) {
-        seen[1] = true;
-        assertEquals(2, response.longValue());
-      }
-    });
-
-    // It doesn't matter which context instance is fired
-    c2.fire(new Receiver<Void>() {
-      @Override
-      public void onSuccess(Void response) {
-        assertTrue(seen[0]);
-        assertTrue(seen[1]);
-        finishTestAndReset();
-      }
-    });
-
-    /*
-     * Since the common State has been locked, calling any other
-     * context-mutation methods should fail.
-     */
-    try {
-      c1.fire();
-      fail("Should have thrown exception");
-    } catch (IllegalStateException expected) {
-    }
-    try {
-      c3.fire();
-      fail("Should have thrown exception");
-    } catch (IllegalStateException expected) {
-    }
-    try {
-      c3.create(SimpleFooProxy.class);
-      fail("Should have thrown exception");
-    } catch (IllegalStateException expected) {
-    }
-  }
-
   /**
    * Test that we can commit child objects.
    */
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
index 43f9681..340c7d4 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
@@ -27,6 +27,7 @@
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
 import com.google.web.bindery.requestfactory.shared.ProxySerializer;
 import com.google.web.bindery.requestfactory.shared.Receiver;
+import com.google.web.bindery.requestfactory.shared.RequestContext;
 import com.google.web.bindery.requestfactory.shared.SimpleFooRequest;
 import com.google.web.bindery.requestfactory.shared.SimpleRequestFactory;
 import com.google.web.bindery.requestfactory.shared.impl.BaseProxyCategory;
@@ -87,6 +88,29 @@
   }
 
   /**
+   * Check that some proxy type can be created by the given context and that
+   * some other proxy type can't.
+   */
+  protected void checkReachableTypes(RequestContext ctx, Class<? extends BaseProxy> shouldWork,
+      Class<? extends BaseProxy> shouldFail) {
+    assertNotNull(ctx.create(shouldWork));
+    try {
+      // Metadata computation has only RequestFactory resolution
+      // http://code.google.com/p/google-web-toolkit/issues/detail?id=6658
+      if (GWT.isClient()) {
+        ctx.create(shouldFail);
+        fail();
+      } else {
+        assertNotNull(ctx.create(shouldFail));
+      }
+    } catch (IllegalArgumentException expected) {
+      if (!GWT.isClient()) {
+        fail("Expect the create call to always work in RFSource implementation");
+      }
+    }
+  }
+
+  /**
    * Run the given proxy through a ProxySerializer and verify that the
    * before-and-after values match.
    */
diff --git a/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryChainedContextJreTest.java b/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryChainedContextJreTest.java
new file mode 100644
index 0000000..3b8a9f0
--- /dev/null
+++ b/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryChainedContextJreTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed 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 com.google.web.bindery.requestfactory.server;
+
+import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryChainedContextTest;
+import com.google.web.bindery.requestfactory.shared.SimpleRequestFactory;
+
+/**
+ * Runs the RequestFactoryChainedContext tests in-process.
+ */
+public class RequestFactoryChainedContextJreTest extends RequestFactoryChainedContextTest {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @Override
+  protected Factory createChainedFactory() {
+    return RequestFactoryJreTest.createInProcess(Factory.class);
+  }
+
+  @Override
+  protected SimpleRequestFactory createFactory() {
+    return RequestFactoryJreTest.createInProcess(SimpleRequestFactory.class);
+  }
+}
diff --git a/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java b/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
index cbc311f..ba26e92 100644
--- a/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
+++ b/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
@@ -20,6 +20,7 @@
 import com.google.web.bindery.requestfactory.server.FanoutReceiverJreTest;
 import com.google.web.bindery.requestfactory.server.FindServiceJreTest;
 import com.google.web.bindery.requestfactory.server.LocatorJreTest;
+import com.google.web.bindery.requestfactory.server.RequestFactoryChainedContextJreTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryExceptionPropagationJreTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryInterfaceValidatorTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryJreTest;
@@ -46,6 +47,7 @@
     suite.addTestSuite(FanoutReceiverJreTest.class);
     suite.addTestSuite(FindServiceJreTest.class);
     suite.addTestSuite(LocatorJreTest.class);
+    suite.addTestSuite(RequestFactoryChainedContextJreTest.class);
     suite.addTestSuite(RequestFactoryExceptionPropagationJreTest.class);
     suite.addTestSuite(RequestFactoryInterfaceValidatorTest.class);
     suite.addTestSuite(RequestFactoryJreTest.class);
