diff --git a/src/test/examples/switchmaps/Colors.java b/src/test/examples/switchmaps/Colors.java
new file mode 100644
index 0000000..b2c8dc1
--- /dev/null
+++ b/src/test/examples/switchmaps/Colors.java
@@ -0,0 +1,19 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package switchmaps;
+
+public enum Colors {
+  RED("rar"), BLUE("blew"), GREEN("soylent"), GRAY("fifty");
+
+  private String aField;
+
+  Colors(String string) {
+    aField = string;
+  }
+
+  @Override
+  public String toString() {
+    return aField;
+  }
+}
diff --git a/src/test/examples/switchmaps/Days.java b/src/test/examples/switchmaps/Days.java
new file mode 100644
index 0000000..b484bb5
--- /dev/null
+++ b/src/test/examples/switchmaps/Days.java
@@ -0,0 +1,8 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package switchmaps;
+
+public enum Days {
+  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
+}
diff --git a/src/test/examples/switchmaps/Switches.java b/src/test/examples/switchmaps/Switches.java
new file mode 100644
index 0000000..bf16856
--- /dev/null
+++ b/src/test/examples/switchmaps/Switches.java
@@ -0,0 +1,66 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package switchmaps;
+
+public class Switches {
+
+  public static void main(String... args) {
+    for (Days value : Days.values()) {
+      switchWithDefault(value);
+      switchFull(value);
+    }
+    for (Colors color : Colors.values()) {
+      switchOnColors(color);
+    }
+  }
+
+  private static void switchOnColors(Colors color) {
+    System.out.println(color.toString());
+    switch (color) {
+      case GRAY:
+        System.out.println("not really");
+        break;
+      case GREEN:
+        System.out.println("sooo green");
+        break;
+      default:
+        System.out.println("colorful");
+    }
+  }
+
+  private static void switchWithDefault(Days day) {
+    switch (day) {
+      case WEDNESDAY:
+      case FRIDAY:
+        System.out.println("3 or 5");
+        break;
+      case SUNDAY:
+        System.out.println("7");
+        break;
+      default:
+        System.out.println("other");
+    }
+  }
+
+  private static void switchFull(Days day) {
+    switch (day) {
+      case MONDAY:
+      case WEDNESDAY:
+      case THURSDAY:
+        System.out.println("1, 3 or 4");
+      case TUESDAY:
+      case FRIDAY:
+        System.out.println("2 or 5");
+        break;
+      case SUNDAY:
+        System.out.println("7");
+        break;
+      case SATURDAY:
+        System.out.println("6");
+        break;
+      default:
+        System.out.println("other");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index 9e7588d..4a06085 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -100,6 +100,7 @@
         {"minification.Minification", null},
         {"enclosingmethod.Main", null},
         {"interfaceinlining.Main", null},
+        {"switchmaps.Switches", null},
     };
 
     List<String[]> fullTestList = new ArrayList<>(tests.length * 2);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index a93fb12..bcb9f7d 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -34,7 +34,7 @@
   /**
    * Write lines of text to a temporary file.
    */
-  protected Path writeTextToTempFile(String... lines) throws IOException{
+  protected Path writeTextToTempFile(String... lines) throws IOException {
     Path file = temp.newFile().toPath();
     FileUtils.writeTextFile(file, lines);
     return file;
@@ -86,7 +86,7 @@
   /**
    * Compile an application with R8 using the supplied proguard configuration.
    */
-  protected  AndroidApp compileWithR8(List<Class> classes, Path proguardConfig)
+  protected AndroidApp compileWithR8(List<Class> classes, Path proguardConfig)
       throws CompilationException, ProguardRuleParserException, ExecutionException, IOException {
     return compileWithR8(readClasses(classes), proguardConfig);
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
new file mode 100644
index 0000000..4e8881a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.rewrite.switchmaps;
+
+import com.android.tools.r8.CompilationException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.shaking.ProguardRuleParserException;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.DexInspector;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.concurrent.ExecutionException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RewriteSwitchMapsTest extends TestBase {
+
+  private static final String JAR_FILE = "switchmaps.jar";
+  private static final String SWITCHMAP_CLASS_NAME = "switchmaps.Switches$1";
+  private static final String PG_CONFIG =
+      "-keep class switchmaps.Switches { public static void main(...); } " +
+          "-dontobfuscate";
+
+  @Test
+  public void checkSwitchMapsRemoved()
+      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
+    AndroidApp.Builder builder = AndroidApp.builder();
+    builder.addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()));
+    builder.addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE));
+    AndroidApp result = compileWithR8(builder.build(), writeTextToTempFile(PG_CONFIG));
+    DexInspector inspector = new DexInspector(result);
+    Assert.assertFalse(inspector.clazz(SWITCHMAP_CLASS_NAME).isPresent());
+  }
+}
