diff --git a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
index 19e33bc..644501d 100644
--- a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
+++ b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
@@ -19,7 +19,7 @@
 import com.google.gwt.core.client.impl.ArtificialRescue;
 import com.google.gwt.core.client.impl.Impl;
 import com.google.gwt.core.client.impl.ArtificialRescue.Rescue;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
@@ -118,7 +118,7 @@
   }
 
   @Override
-  protected void generateTypeHandlers(TreeLogger logger, GeneratorContextExt ctx,
+  protected void generateTypeHandlers(TreeLogger logger, GeneratorContext ctx,
       SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
@@ -271,7 +271,7 @@
 
   @Override
   protected String writeSerializationPolicyFile(TreeLogger logger,
-      GeneratorContextExt ctx, SerializableTypeOracle serializationSto,
+      GeneratorContext ctx, SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
 
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
index da4e52e..4921dd4 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
@@ -19,7 +19,7 @@
 import com.google.gwt.core.client.impl.Impl;
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.ConfigurationProperty;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
@@ -248,7 +248,7 @@
    *
    * @throws UnableToCompleteException
    */
-  public String create(TreeLogger logger, GeneratorContextExt context)
+  public String create(TreeLogger logger, GeneratorContext context)
       throws UnableToCompleteException {
     TypeOracle typeOracle = context.getTypeOracle();
 
@@ -690,7 +690,7 @@
   }
 
   protected void generateTypeHandlers(TreeLogger logger,
-      GeneratorContextExt context, SerializableTypeOracle typesSentFromBrowser,
+      GeneratorContext context, SerializableTypeOracle typesSentFromBrowser,
       SerializableTypeOracle typesSentToBrowser)
       throws UnableToCompleteException {
     Event event = SpeedTracerLogger.start(CompilerEventType.GENERATOR_RPC_TYPE_SERIALIZER);
@@ -729,7 +729,7 @@
   }
 
   protected String writeSerializationPolicyFile(TreeLogger logger,
-      GeneratorContextExt ctx, SerializableTypeOracle serializationSto,
+      GeneratorContext ctx, SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
     try {
@@ -830,7 +830,7 @@
   }
 
   private void emitPolicyFileArtifact(TreeLogger logger,
-      GeneratorContextExt context, String partialPath)
+      GeneratorContext context, String partialPath)
       throws UnableToCompleteException {
     try {
       String qualifiedSourceName = serviceIntf.getQualifiedSourceName();
@@ -881,7 +881,7 @@
     return ResponseReader.OBJECT;
   }
 
-  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContextExt ctx,
+  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx,
       JClassType serviceAsync) {
     JPackage serviceIntfPkg = serviceAsync.getPackage();
     String packageName = serviceIntfPkg == null ? "" : serviceIntfPkg.getName();
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java b/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
index 0ac93b4..ded7cda 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
@@ -15,25 +15,23 @@
  */
 package com.google.gwt.user.rebind.rpc;
 
-import com.google.gwt.core.ext.GeneratorContextExt;
-import com.google.gwt.core.ext.GeneratorExt;
+import com.google.gwt.core.ext.Generator;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.rebind.RebindResult;
-import com.google.gwt.dev.javac.rebind.RebindStatus;
 
 /**
  * Generator for producing the asynchronous version of a
  * {@link com.google.gwt.user.client.rpc.RemoteService RemoteService} interface.
  */
-public class ServiceInterfaceProxyGenerator extends GeneratorExt {
+public class ServiceInterfaceProxyGenerator extends Generator {
 
   @Override
-  public RebindResult generateIncrementally(TreeLogger logger, GeneratorContextExt ctx,
+  public String generate(TreeLogger logger, GeneratorContext ctx,
       String requestedClass) throws UnableToCompleteException {
-    
+
     TypeOracle typeOracle = ctx.getTypeOracle();
     assert (typeOracle != null);
 
@@ -56,16 +54,7 @@
         "Generating client proxy for remote service interface '"
             + remoteService.getQualifiedSourceName() + "'", null);
 
-    String returnTypeName = proxyCreator.create(proxyLogger, ctx);
-    
-    /*
-     * Return with RebindStatus.USE_PARTIAL_CACHED, since we are implementing an
-     * incremental scheme, which allows us to use a mixture of previously cached
-     * and newly generated compilation units and artifacts.  For example, the
-     * field serializers only need to be generated fresh if their source type
-     * has changed (or if no previously cached version exists).
-     */
-    return new RebindResult(RebindStatus.USE_PARTIAL_CACHED, returnTypeName);
+    return proxyCreator.create(proxyLogger, ctx);
   }
 
   protected ProxyCreator createProxyCreator(JClassType remoteService) {
diff --git a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
index b286735..ebb31d8 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
@@ -21,7 +21,7 @@
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.ConfigurationProperty;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -29,7 +29,6 @@
 import com.google.gwt.core.ext.typeinfo.JParameterizedType;
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.rebind.CachedRebindResult;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
@@ -100,7 +99,7 @@
     }
   }
 
-  private final GeneratorContextExt context;
+  private final GeneratorContext context;
 
   private final SerializableTypeOracle deserializationOracle;
 
@@ -122,7 +121,7 @@
 
   public TypeSerializerCreator(TreeLogger logger,
       SerializableTypeOracle serializationOracle,
-      SerializableTypeOracle deserializationOracle, GeneratorContextExt context,
+      SerializableTypeOracle deserializationOracle, GeneratorContext context,
       String typeSerializerClassName, String typeSerializerSimpleName)
       throws UnableToCompleteException {
     this.context = context;
@@ -203,52 +202,44 @@
 
     return typeSerializerClassName;
   }
-  
+
   /*
    * Create a field serializer for a type if it does not have a custom
    * serializer.
    */
-  private void createFieldSerializer(TreeLogger logger, GeneratorContextExt ctx,
+  private void createFieldSerializer(TreeLogger logger, GeneratorContext ctx,
       JType type) {
     Event event = SpeedTracerLogger.start(CompilerEventType.GENERATOR_RPC_FIELD_SERIALIZER);
-    try {
-      assert (type != null);
-      assert (serializationOracle.isSerializable(type) || deserializationOracle.isSerializable(type));
-  
-      JParameterizedType parameterizedType = type.isParameterized();
-      if (parameterizedType != null) {
-        createFieldSerializer(logger, ctx, parameterizedType.getRawType());
-        return;
-      }
-  
-      /*
-       * Only a JClassType can reach this point in the code. JPrimitives have been
-       * removed because their serialization is built in, interfaces have been
-       * removed because they are not an instantiable type and parameterized types
-       * have been broken down into their raw types.
-       */
-      assert (type.isClass() != null || type.isArray() != null);
-      
-      if (findCacheableFieldSerializerAndMarkForReuseIfAvailable(ctx, type)) {
-        // skip generation of field serializer
-        return;
-      }
-  
-      JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
-          typeOracle, type);
-      FieldSerializerCreator creator = new FieldSerializerCreator(typeOracle,
-          serializationOracle, deserializationOracle, (JClassType) type,
-          customFieldSerializer);
-      creator.realize(logger, ctx);
-    } finally {
-      event.end();
+    assert (type != null);
+    assert (serializationOracle.isSerializable(type) || deserializationOracle.isSerializable(type));
+
+    JParameterizedType parameterizedType = type.isParameterized();
+    if (parameterizedType != null) {
+      createFieldSerializer(logger, ctx, parameterizedType.getRawType());
+      return;
     }
+
+    /*
+     * Only a JClassType can reach this point in the code. JPrimitives have been
+     * removed because their serialization is built in, interfaces have been
+     * removed because they are not an instantiable type and parameterized types
+     * have been broken down into their raw types.
+     */
+    assert (type.isClass() != null || type.isArray() != null);
+
+    JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
+        typeOracle, type);
+    FieldSerializerCreator creator = new FieldSerializerCreator(typeOracle,
+        serializationOracle, deserializationOracle, (JClassType) type,
+        customFieldSerializer);
+    creator.realize(logger, ctx);
+    event.end();
   }
 
   /*
    * Create all of the necessary field serializers.
    */
-  private void createFieldSerializers(TreeLogger logger, GeneratorContextExt ctx) {
+  private void createFieldSerializers(TreeLogger logger, GeneratorContext ctx) {
     JType[] types = getSerializableTypes();
     int typeCount = types.length;
     for (int typeIndex = 0; typeIndex < typeCount; ++typeIndex) {
@@ -258,51 +249,7 @@
       createFieldSerializer(logger, ctx, type);
     }
   }
-  
-  /*
-   * check whether we can use a previously generated version of a 
-   * FieldSerializer.  If so, mark it for reuse, and return true.
-   * Otherwise return false.
-   */
-  private boolean findCacheableFieldSerializerAndMarkForReuseIfAvailable(
-      GeneratorContextExt ctx, JType type) {
-    
-    CachedRebindResult lastResult = ctx.getCachedGeneratorResult();
-    if (lastResult == null || !ctx.isGeneratorResultCachingEnabled()) {
-      return false;
-    }
-    
-    String fieldSerializerName = 
-      SerializationUtils.getStandardSerializerName((JClassType) type);
-    
-    if (type instanceof JClassType) {
-      // check that it is available for reuse
-      if (!lastResult.isTypeCached(fieldSerializerName)) {
-        return false;
-      }
-    } else {
-      return false;
-    }
-          
-    try {
-      /*
-       * TODO(jbrosenberg): Change this check to use getVersion() from 
-       * TypeOracle, once that is available.
-       */
-      long lastModified = ctx.getSourceLastModifiedTime((JClassType) type);
-      
-      if (lastModified != 0L &&
-          lastModified < lastResult.getTimeGenerated()) {
-        
-        // use cached version  
-        return ctx.reuseTypeFromCacheIfAvailable(fieldSerializerName);
-      }
-    } catch (RuntimeException ex) {
-      // could get an exception checking modified time
-    }
-      
-    return false;
-  }
+
   private String[] getPackageAndClassName(String fullClassName) {
     String className = fullClassName;
     String packageName = "";
@@ -318,7 +265,7 @@
     return serializableTypes;
   }
 
-  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContextExt ctx) {
+  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx) {
     String name[] = getPackageAndClassName(typeSerializerClassName);
     String packageName = name[0];
     String className = name[1];
