diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
index ab3c996..742e8c6 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
@@ -24,6 +24,7 @@
 import com.google.gwt.dev.javac.UnitCacheSingleton;
 import com.google.gwt.dev.util.DiskCachingUtil;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
+import com.google.gwt.thirdparty.guava.common.collect.ImmutableMap;
 import com.google.gwt.util.tools.Utility;
 
 import java.io.File;
@@ -69,7 +70,8 @@
             DiskCachingUtil.computePreferredCacheDir(options.getModuleNames(), logger);
         UnitCache unitCache = UnitCacheSingleton.get(logger, null, baseCacheDir);
         MinimalRebuildCacheManager minimalRebuildCacheManager =
-            new MinimalRebuildCacheManager(logger, baseCacheDir);
+            createMinimalRebuildCacheManager(logger, options, baseCacheDir);
+
         outboxTable = makeOutboxTable(options, logger, unitCache, minimalRebuildCacheManager);
       } catch (Throwable t) {
         t.printStackTrace();
@@ -112,6 +114,21 @@
     }
   }
 
+  private static MinimalRebuildCacheManager createMinimalRebuildCacheManager(
+      PrintWriterTreeLogger logger, Options options,File baseCacheDir) {
+    return new MinimalRebuildCacheManager(
+        logger,
+        baseCacheDir,
+        ImmutableMap.of(
+            "style", options.getOutput().name(),
+            "closureFormattedOutput",
+                Boolean.valueOf(options.isClosureFormattedOutput()).toString(),
+            "generateJsInteropExports",
+                Boolean.valueOf(options.shouldGenerateJsInteropExports()).toString(),
+            "methodDisplayMode", options.getMethodNameDisplayMode().name())
+    );
+  }
+
   /**
    * Starts the code server with the given command line options. To shut it down, see
    * {@link WebServer#stop}.
@@ -128,7 +145,7 @@
         DiskCachingUtil.computePreferredCacheDir(options.getModuleNames(), startupLogger);
     UnitCache unitCache = UnitCacheSingleton.get(startupLogger, null, baseCacheDir);
     MinimalRebuildCacheManager minimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(topLogger, baseCacheDir);
+        createMinimalRebuildCacheManager(topLogger, options, baseCacheDir);
     OutboxTable outboxTable =
         makeOutboxTable(options, startupLogger, unitCache, minimalRebuildCacheManager);
 
diff --git a/dev/codeserver/javatests/com/google/gwt/dev/codeserver/RecompilerTest.java b/dev/codeserver/javatests/com/google/gwt/dev/codeserver/RecompilerTest.java
index 737030e..c63e949 100644
--- a/dev/codeserver/javatests/com/google/gwt/dev/codeserver/RecompilerTest.java
+++ b/dev/codeserver/javatests/com/google/gwt/dev/codeserver/RecompilerTest.java
@@ -26,6 +26,7 @@
 import com.google.gwt.dev.javac.testing.impl.MockResource;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
 import com.google.gwt.thirdparty.guava.common.base.Charsets;
+import com.google.gwt.thirdparty.guava.common.collect.ImmutableMap;
 import com.google.gwt.thirdparty.guava.common.collect.Lists;
 import com.google.gwt.thirdparty.guava.common.io.Files;
 
@@ -176,7 +177,7 @@
     File baseCacheDir = Files.createTempDir();
     UnitCache unitCache = UnitCacheSingleton.get(logger, null, baseCacheDir);
     MinimalRebuildCacheManager minimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(logger, baseCacheDir);
+        new MinimalRebuildCacheManager(logger, baseCacheDir, ImmutableMap.<String, String>of());
     Recompiler recompiler = new Recompiler(OutboxDir.create(Files.createTempDir(), logger), null,
         "com.foo.SimpleModule", options, unitCache, minimalRebuildCacheManager);
     Outbox outbox = new Outbox("Transactional Cache", recompiler, options, logger);
@@ -222,7 +223,7 @@
     File baseCacheDir = Files.createTempDir();
     UnitCache unitCache = UnitCacheSingleton.get(logger, null, baseCacheDir);
     MinimalRebuildCacheManager minimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(logger, baseCacheDir);
+        new MinimalRebuildCacheManager(logger, baseCacheDir, ImmutableMap.<String, String>of());
     Recompiler recompiler = new Recompiler(OutboxDir.create(Files.createTempDir(), logger), null,
         "com.foo.PropertyModule", options, unitCache, minimalRebuildCacheManager);
     Outbox outbox = new Outbox("Transactional Cache", recompiler, options, logger);
diff --git a/dev/core/src/com/google/gwt/dev/MinimalRebuildCacheManager.java b/dev/core/src/com/google/gwt/dev/MinimalRebuildCacheManager.java
index 6df1f53..9cdb468 100644
--- a/dev/core/src/com/google/gwt/dev/MinimalRebuildCacheManager.java
+++ b/dev/core/src/com/google/gwt/dev/MinimalRebuildCacheManager.java
@@ -33,6 +33,8 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -57,9 +59,12 @@
   private final File minimalRebuildCacheDir;
   private final Cache<String, MinimalRebuildCache> minimalRebuildCachesByName =
       CacheBuilder.newBuilder().maximumSize(MEMORY_CACHE_COUNT_LIMIT).build();
+  private final Map<String, String> options = new LinkedHashMap<>();
 
-  public MinimalRebuildCacheManager(TreeLogger logger, File baseCacheDir) {
+  public MinimalRebuildCacheManager(
+      TreeLogger logger, File baseCacheDir, Map<String, String> options) {
     this.logger = logger;
+    this.options.putAll(options);
     if (baseCacheDir != null) {
       minimalRebuildCacheDir = new File(baseCacheDir, REBUILD_CACHE_PREFIX);
       minimalRebuildCacheDir.mkdir();
@@ -88,7 +93,8 @@
    */
   public synchronized MinimalRebuildCache getCache(String moduleName,
       PermutationDescription permutationDescription) {
-    String cacheName = computeMinimalRebuildCacheName(moduleName, permutationDescription);
+    String cacheName =
+        computeMinimalRebuildCacheName(moduleName, permutationDescription);
 
     MinimalRebuildCache minimalRebuildCache = minimalRebuildCachesByName.getIfPresent(cacheName);
 
@@ -269,9 +275,21 @@
     String currentWorkingDirectory = System.getProperty("user.dir");
     String compilerVersionHash = CompilerVersion.getHash();
     String permutationDescriptionString = permutationDescription.toString();
+    String optionsDescriptionString = " Options [";
+    String separator = "";
+    for (Map.Entry entry : options.entrySet()) {
+      optionsDescriptionString +=
+          String.format("%s%s = %s", separator, entry.getKey(), entry.getValue());
+      separator = ",";
+    }
+    optionsDescriptionString += "]";
 
     String consistentHash = StringUtils.toHexString(Md5Utils.getMd5Digest((
-        compilerVersionHash + moduleName + currentWorkingDirectory + permutationDescriptionString)
+        compilerVersionHash
+            + moduleName
+            + currentWorkingDirectory
+            + permutationDescriptionString
+            + optionsDescriptionString)
         .getBytes()));
     return REBUILD_CACHE_PREFIX + "-" + consistentHash;
   }
diff --git a/dev/core/test/com/google/gwt/dev/MinimalRebuildCacheManagerTest.java b/dev/core/test/com/google/gwt/dev/MinimalRebuildCacheManagerTest.java
index c0ab6b0..11aae8b 100644
--- a/dev/core/test/com/google/gwt/dev/MinimalRebuildCacheManagerTest.java
+++ b/dev/core/test/com/google/gwt/dev/MinimalRebuildCacheManagerTest.java
@@ -30,22 +30,73 @@
  */
 public class MinimalRebuildCacheManagerTest extends TestCase {
 
-  public void testNoSuchCache() {
+  public void testCacheChange() throws InterruptedException {
+    String moduleName = "com.google.FooModule";
+    Map<String, String> initialCompilerOptions = ImmutableMap.of("option", "oldvalue");
+    PermutationDescription permutationDescription = new PermutationDescription();
+    File cacheDir = Files.createTempDir();
+
     MinimalRebuildCacheManager minimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(TreeLogger.NULL, Files.createTempDir());
+        new MinimalRebuildCacheManager(
+            TreeLogger.NULL, cacheDir, initialCompilerOptions);
 
     // Make sure we start with a blank slate.
     minimalRebuildCacheManager.deleteCaches();
 
     // Construct and empty cache and also ask the manager to get a cache which does not exist.
     MinimalRebuildCache emptyCache = new MinimalRebuildCache();
-    MinimalRebuildCache noSuchCache = minimalRebuildCacheManager.getCache("com.google.FooModule",
-        new PermutationDescription());
+    MinimalRebuildCache fooCacheOld = minimalRebuildCacheManager.getCache(moduleName,
+        permutationDescription);
+
+    // Show that the manager created a new empty cache for the request of a cache that does not
+    // exist. Do not test instnace equality as getCache always returns a copy.
+    assertTrue(emptyCache.hasSameContent(fooCacheOld));
+
+    // Set some data into the cache
+    fooCacheOld.addTypeReference("Type1", "Type2");
+    assertFalse(emptyCache.hasSameContent(fooCacheOld));
+
+    // Set the cache back and shut down the manager to wait for the cache to be written to disk.
+    minimalRebuildCacheManager.enqueueAsyncWriteDiskCache(
+        moduleName, permutationDescription, fooCacheOld);
+    minimalRebuildCacheManager.shutdown();
+
+    // Change compiler options and get a new cache manager.
+    Map<String, String> newCompilerOptions = ImmutableMap.of("option", "newvalue");
+    minimalRebuildCacheManager =
+        new MinimalRebuildCacheManager(
+            TreeLogger.NULL, cacheDir, newCompilerOptions);
+
+    // Now get the cache for FooModule under different compiler flags
+    MinimalRebuildCache fooCacheNew = minimalRebuildCacheManager.getCache(moduleName,
+        permutationDescription);
 
     // Show that the manager created a new empty cache for the request of a cache that does not
     // exist.
-    assertFalse(emptyCache == noSuchCache);
-    assertTrue(emptyCache.hasSameContent(noSuchCache));
+    assertTrue(emptyCache.hasSameContent(fooCacheNew));
+    assertFalse(fooCacheOld.hasSameContent(fooCacheNew));
+
+    // Set the cache back and shut down the manager to wait for the cache to be written to disk.
+    minimalRebuildCacheManager.enqueueAsyncWriteDiskCache(
+        moduleName, permutationDescription, fooCacheNew);
+    minimalRebuildCacheManager.shutdown();
+
+    // Switch back to the initial option values and verify you get the same old cache.
+    minimalRebuildCacheManager =
+        new MinimalRebuildCacheManager(
+            TreeLogger.NULL, cacheDir, initialCompilerOptions);
+
+    // Now get the cache for FooModule under different under initial options values.
+    MinimalRebuildCache fooCacheResetOptions = minimalRebuildCacheManager.getCache(
+        moduleName,
+        permutationDescription);
+
+    // Show that the manager retrieved the already existing cache for FooModule under initial
+    // compiler options.
+    assertTrue(fooCacheOld.hasSameContent(fooCacheResetOptions));
+    minimalRebuildCacheManager.deleteCaches();
+    minimalRebuildCacheManager.shutdown();
+    cacheDir.delete();
   }
 
   public void testReload() throws InterruptedException {
@@ -53,7 +104,8 @@
 
     String moduleName = "com.google.FooModule";
     MinimalRebuildCacheManager minimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(TreeLogger.NULL, cacheDir);
+        new MinimalRebuildCacheManager(
+            TreeLogger.NULL, cacheDir, ImmutableMap.<String, String>of());
     PermutationDescription permutationDescription = new PermutationDescription();
 
     // Make sure we start with a blank slate.
@@ -96,7 +148,8 @@
 
     // Start a new cache manager in the same folder.
     MinimalRebuildCacheManager reloadedMinimalRebuildCacheManager =
-        new MinimalRebuildCacheManager(TreeLogger.NULL, cacheDir);
+        new MinimalRebuildCacheManager(
+            TreeLogger.NULL, cacheDir, ImmutableMap.<String, String>of());
 
     // Reread the previously saved cache.
     MinimalRebuildCache reloadedCache =
