diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index 1ffc4be..69d575b 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -69,13 +69,13 @@
  * any GUI dependencies.
  */
 public abstract class DevModeBase implements DoneCallback {
-
   /**
    * Implementation of BrowserWidgetHost that supports the abstract UI
    * interface.
    */
   public class UiBrowserWidgetHostImpl implements BrowserWidgetHost {
 
+    @Override
     public ModuleHandle createModuleLogger(String moduleName, String userAgent, String url,
         String tabKey, String sessionKey, BrowserChannelServer serverChannel, byte[] userAgentIcon) {
       if (sessionKey == null) {
@@ -91,6 +91,7 @@
       return module;
     }
 
+    @Override
     public ModuleSpaceHost createModuleSpaceHost(ModuleHandle module, String moduleName)
         throws UnableToCompleteException {
       Event moduleSpaceHostCreateEvent =
@@ -477,34 +478,42 @@
     private int remoteUIHostPort;
     private final List<String> startupURLs = new ArrayList<String>();
 
+    @Override
     public void addStartupURL(String url) {
       startupURLs.add(url);
     }
 
+    @Override
     public boolean alsoLogToFile() {
       return logDir != null;
     }
 
+    @Override
     public String getBindAddress() {
       return bindAddress;
     }
 
+    @Override
     public String getClientId() {
       return remoteUIClientId;
     }
 
+    @Override
     public int getCodeServerPort() {
       return codeServerPort;
     }
 
+    @Override
     public String getConnectAddress() {
       return connectAddress;
     }
 
+    @Override
     public File getLogDir() {
       return logDir;
     }
 
+    @Override
     public File getLogFile(String sublog) {
       if (logDir == null) {
         return null;
@@ -512,62 +521,77 @@
       return new File(logDir, sublog);
     }
 
+    @Override
     public int getPort() {
       return port;
     }
 
+    @Override
     public String getRemoteUIHost() {
       return remoteUIHost;
     }
 
+    @Override
     public int getRemoteUIHostPort() {
       return remoteUIHostPort;
     }
 
+    @Override
     public List<String> getStartupURLs() {
       return Collections.unmodifiableList(startupURLs);
     }
 
+    @Override
     public boolean isNoServer() {
       return isNoServer;
     }
 
+    @Override
     public void setBindAddress(String bindAddress) {
       this.bindAddress = bindAddress;
     }
 
+    @Override
     public void setClientId(String clientId) {
       this.remoteUIClientId = clientId;
     }
 
+    @Override
     public void setCodeServerPort(int port) {
       codeServerPort = port;
     }
 
+    @Override
     public void setConnectAddress(String connectAddress) {
       this.connectAddress = connectAddress;
     }
 
+    @Override
     public void setLogFile(String filename) {
       logDir = new File(filename);
     }
 
+    @Override
     public void setNoServer(boolean isNoServer) {
       this.isNoServer = isNoServer;
     }
 
+    @Override
     public void setPort(int port) {
       this.port = port;
     }
 
+    @Override
     public void setRemoteUIHost(String remoteUIHost) {
       this.remoteUIHost = remoteUIHost;
     }
 
+    @Override
     public void setRemoteUIHostPort(int remoteUIHostPort) {
       this.remoteUIHostPort = remoteUIHostPort;
     }
 
+    @Override
     public boolean useRemoteUI() {
       return remoteUIHost != null;
     }
@@ -668,7 +692,7 @@
       registerHandler(new ArgHandlerPort(options));
       registerHandler(new ArgHandlerWhitelist());
       registerHandler(new ArgHandlerBlacklist());
-      registerHandler(new ArgHandlerEnableGeneratorResultCaching(options));
+      registerHandler(new ArgHandlerEnableGeneratorResultCaching());
       registerHandler(new ArgHandlerLogDir(options));
       registerHandler(new ArgHandlerLogLevel(options));
       registerHandler(new ArgHandlerGenDir(options));
@@ -678,6 +702,9 @@
     }
   }
 
+  private static final boolean generatorResultCachingDisabled =
+      (System.getProperty("gwt.disableGeneratorResultCaching") != null);
+
   private static final Random RNG = new Random();
 
   public static String normalizeURL(String unknownUrlText, boolean isHttps, int port, String host) {
@@ -793,6 +820,7 @@
   /**
    * Callback for the UI to indicate it is done.
    */
+  @Override
   public void onDone() {
     setDone();
   }
@@ -1114,6 +1142,7 @@
       throws UnableToCompleteException {
     final StandardLinkerContext linkerContext = link(logger, module);
     return new ArtifactAcceptor() {
+      @Override
       public void accept(TreeLogger relinkLogger, ArtifactSet newArtifacts)
           throws UnableToCompleteException {
         relink(relinkLogger, linkerContext, module, newArtifacts);
@@ -1160,7 +1189,7 @@
 
   private RebindCache getRebindCache(String moduleName) {
 
-    if (!options.isGeneratorResultCachingEnabled()) {
+    if (generatorResultCachingDisabled) {
       return null;
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
index cf99d31..7abf8b5 100644
--- a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
@@ -103,11 +103,6 @@
   }
 
   @Override
-  public boolean isGeneratorResultCachingEnabled() {
-    return jjsOptions.isGeneratorResultCachingEnabled();
-  }
-
-  @Override
   public boolean isOptimizePrecompile() {
     return jjsOptions.isOptimizePrecompile();
   }
@@ -188,11 +183,6 @@
   }
 
   @Override
-  public void setGeneratorResultCachingEnabled(boolean enabled) {
-    jjsOptions.setGeneratorResultCachingEnabled(enabled);
-  }
-
-  @Override
   public void setMaxPermsPerPrecompile(int maxPermsPerPrecompile) {
     this.maxPermsPerPrecompile = maxPermsPerPrecompile;
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
index 886a312..fc13cde 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
@@ -19,7 +19,6 @@
 import com.google.gwt.dev.util.arg.OptionDisableCastChecking;
 import com.google.gwt.dev.util.arg.OptionDisableClassMetadata;
 import com.google.gwt.dev.util.arg.OptionEnableAssertions;
-import com.google.gwt.dev.util.arg.OptionEnableGeneratorResultCaching;
 import com.google.gwt.dev.util.arg.OptionOptimize;
 import com.google.gwt.dev.util.arg.OptionOptimizePrecompile;
 import com.google.gwt.dev.util.arg.OptionRunAsyncEnabled;
@@ -34,8 +33,7 @@
  */
 public interface JJSOptions extends OptionOptimize, OptionAggressivelyOptimize,
     OptionDisableClassMetadata, OptionDisableCastChecking, OptionEnableAssertions,
-    OptionEnableGeneratorResultCaching, OptionRunAsyncEnabled, OptionScriptStyle,
-    OptionSoycEnabled, OptionSoycDetailed, OptionOptimizePrecompile, OptionStrict,
-    OptionSoycHtmlDisabled {
+    OptionRunAsyncEnabled, OptionScriptStyle, OptionSoycEnabled, OptionSoycDetailed,
+    OptionOptimizePrecompile, OptionStrict, OptionSoycHtmlDisabled {
 
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index 417f6fa..d3abb04 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -29,7 +29,6 @@
   private boolean disableCastChecking = false;
   private boolean disableClassMetadata = false;
   private boolean enableAssertions;
-  private boolean enableGeneratorResultCaching = false;
   private int optimizationLevel = OptionOptimize.OPTIMIZE_LEVEL_MAX;
   private boolean optimizePrecompile = false;
   private JsOutputOption output = JsOutputOption.OBFUSCATED;
@@ -52,7 +51,6 @@
     setClassMetadataDisabled(other.isClassMetadataDisabled());
     setCompilerMetricsEnabled(other.isCompilerMetricsEnabled());
     setEnableAssertions(other.isEnableAssertions());
-    setGeneratorResultCachingEnabled(other.isGeneratorResultCachingEnabled());
     setOptimizationLevel(other.getOptimizationLevel());
     setOutput(other.getOutput());
     setRunAsyncEnabled(other.isRunAsyncEnabled());
@@ -62,26 +60,32 @@
     setStrict(other.isStrict());
   }
 
+  @Override
   public int getOptimizationLevel() {
     return optimizationLevel;
   }
 
+  @Override
   public JsOutputOption getOutput() {
     return output;
   }
 
+  @Override
   public boolean isAggressivelyOptimize() {
     return aggressivelyOptimize;
   }
 
+  @Override
   public boolean isCastCheckingDisabled() {
     return disableCastChecking;
   }
 
+  @Override
   public boolean isClassMetadataDisabled() {
     return disableClassMetadata;
   }
 
+  @Override
   public boolean isCompilerMetricsEnabled() {
     return compilerMetricsEnabled;
   }
@@ -90,90 +94,102 @@
     return optimizationLevel == OptionOptimize.OPTIMIZE_LEVEL_DRAFT;
   }
 
+  @Override
   public boolean isEnableAssertions() {
     return enableAssertions;
   }
 
-  public boolean isGeneratorResultCachingEnabled() {
-    return enableGeneratorResultCaching;
-  }
-
+  @Override
   public boolean isOptimizePrecompile() {
     return optimizePrecompile;
   }
 
+  @Override
   public boolean isRunAsyncEnabled() {
     return runAsyncEnabled;
   }
 
+  @Override
   public boolean isSoycEnabled() {
     return soycEnabled;
   }
 
+  @Override
   public boolean isSoycExtra() {
     return soycExtra;
   }
   
+  @Override
   public boolean isSoycHtmlDisabled() {
     return soycHtmlDisabled;
   }
 
+  @Override
   public boolean isStrict() {
     return strict;
   }
 
+  @Override
   public void setAggressivelyOptimize(boolean aggressivelyOptimize) {
     this.aggressivelyOptimize = aggressivelyOptimize;
   }
 
+  @Override
   public void setCastCheckingDisabled(boolean disabled) {
     disableCastChecking = disabled;
   }
 
+  @Override
   public void setClassMetadataDisabled(boolean disabled) {
     disableClassMetadata = disabled;
   }
 
+  @Override
   public void setCompilerMetricsEnabled(boolean enabled) {
     this.compilerMetricsEnabled = enabled;
   }
 
+  @Override
   public void setEnableAssertions(boolean enableAssertions) {
     this.enableAssertions = enableAssertions;
   }
 
-  public void setGeneratorResultCachingEnabled(boolean enabled) {
-    this.enableGeneratorResultCaching = enabled;
-  }
-
+  @Override
   public void setOptimizationLevel(int level) {
     optimizationLevel = level;
   }
 
+  @Override
   public void setOptimizePrecompile(boolean optimize) {
     optimizePrecompile = optimize;
   }
 
+  @Override
   public void setOutput(JsOutputOption output) {
     this.output = output;
   }
 
+  @Override
   public void setRunAsyncEnabled(boolean enabled) {
     runAsyncEnabled = enabled;
   }
 
+  @Override
   public void setSoycEnabled(boolean enabled) {
     soycEnabled = enabled;
   }
 
+  @Override
   public void setSoycExtra(boolean enabled) {
     soycExtra = enabled;
   }
   
+  @Override
   public void setSoycHtmlDisabled(boolean disabled) {
     soycHtmlDisabled = disabled;
   }
 
+  @Override
   public void setStrict(boolean strict) {
     this.strict = strict;
   }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
index b9b8f29..9825457 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableGeneratorResultCaching.java
@@ -19,18 +19,19 @@
 
 /**
  * An ArgHandler to provide the -XenableGeneratorResultCaching flag.
+ * 
+ * Note: This is no longer needed since generator result caching is now enabled by default.
+ * It's left here for an interim period, so that uses of the flag can be removed.
+ * TODO(jbrosenberg): remove this after interim period.
  */
 public class ArgHandlerEnableGeneratorResultCaching extends ArgHandlerFlag {
 
-  private final OptionEnableGeneratorResultCaching option;
-
-  public ArgHandlerEnableGeneratorResultCaching(OptionEnableGeneratorResultCaching option) {
-    this.option = option;
+  public ArgHandlerEnableGeneratorResultCaching() {
   }
 
   @Override
   public String getPurpose() {
-    return "EXPERIMENTAL: enables generator result caching, for those generators that implement it";
+    return "Enables generator result caching, for those generators that implement it";
   }
 
   @Override
@@ -45,7 +46,6 @@
  
   @Override
   public boolean setFlag() {
-    option.setGeneratorResultCachingEnabled(true);
     return true;
   }
 }
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index d20427c..eb9b112 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -42,7 +42,6 @@
 import com.google.gwt.dev.util.arg.ArgHandlerDisableUpdateCheck;
 import com.google.gwt.dev.util.arg.ArgHandlerDraftCompile;
 import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions;
-import com.google.gwt.dev.util.arg.ArgHandlerEnableGeneratorResultCaching;
 import com.google.gwt.dev.util.arg.ArgHandlerExtraDir;
 import com.google.gwt.dev.util.arg.ArgHandlerGenDir;
 import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers;
@@ -191,7 +190,6 @@
       registerHandler(new ArgHandlerDisableRunAsync(options));
       registerHandler(new ArgHandlerDisableUpdateCheck(options));
       registerHandler(new ArgHandlerDraftCompile(options));
-      registerHandler(new ArgHandlerEnableGeneratorResultCaching(options));
       registerHandler(new ArgHandlerMaxPermsPerPrecompile(options));
       registerHandler(new ArgHandlerLocalWorkers(options));
 
