diff --git a/dev/build.xml b/dev/build.xml
index 401717f..f1af6a0 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -69,8 +69,8 @@
           <include name="guava/guava-18.0/guava-18.0-rebased.jar"/>
           <include name="icu4j/50.1.1/icu4j.jar"/>
           <include name="jetty/jetty-9.2.14.v20151106/jetty-all-9.2.14.v20151106.jar"/>
-          <include name="jscomp/20131118.json.rebased/compiler-rebased.jar"/>
-          <include name="jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
+          <include name="jscomp/20160315/compiler-rebased.jar"/>
+          <include name="jscomp/20160315/sourcemap-rebased.jar"/>
           <include name="jsr305/jsr305.jar"/>
           <include name="protobuf/protobuf-2.5.0/protobuf-java-rebased-2.5.0.jar"/>
           <!-- dependencies needed for JSP support in DevMode: BEGIN -->
@@ -122,8 +122,8 @@
           <zipfileset src="${gwt.tools.lib}/icu4j/50.1.1/icu4j.jar"/>
           <zipfileset
               src="${gwt.tools.lib}/jetty/jetty-9.2.14.v20151106/jetty-all-9.2.14.v20151106.jar"/>
-          <zipfileset src="${gwt.tools.lib}/jscomp/20131118.json.rebased/compiler-rebased.jar"/>
-          <zipfileset src="${gwt.tools.lib}/jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
+          <zipfileset src="${gwt.tools.lib}/jscomp/20160315/compiler-rebased.jar"/>
+          <zipfileset src="${gwt.tools.lib}/jscomp/20160315/sourcemap-rebased.jar"/>
           <zipfileset src="${gwt.tools.lib}/jsr305/jsr305.jar"/>
           <zipfileset
               src="${gwt.tools.lib}/protobuf/protobuf-2.5.0/protobuf-java-rebased-2.5.0.jar"/>
@@ -206,8 +206,8 @@
             location="${gwt.tools.lib}/eclipse/jdtCompilerAdapter_3.11.2-CUSTOM-GWT-2.8-20160205.jar"/>
         <pathelement
             location="${gwt.tools.lib}/guava/guava-18.0/guava-18.0-rebased.jar"/>
-        <pathelement location="${gwt.tools.lib}/jscomp/20131118.json.rebased/compiler-rebased.jar"/>
-        <pathelement location="${gwt.tools.lib}/jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
+        <pathelement location="${gwt.tools.lib}/jscomp/20160315/compiler-rebased.jar"/>
+        <pathelement location="${gwt.tools.lib}/jscomp/20160315/sourcemap-rebased.jar"/>
         <pathelement location="${gwt.tools.lib}/json/android-sdk-19.1/json-android-rebased.jar"/>
         <pathelement location="${gwt.tools.lib}/jsr305/jsr305.jar"/>
         <pathelement
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
index db03d31..60c8e04 100644
--- a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
+++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
@@ -71,13 +71,14 @@
 import com.google.gwt.dev.js.ast.NodeKind;
 import com.google.gwt.thirdparty.guava.common.base.Preconditions;
 import com.google.gwt.thirdparty.guava.common.collect.Sets;
+import com.google.gwt.thirdparty.javascript.jscomp.AbstractCompiler;
 import com.google.gwt.thirdparty.javascript.jscomp.AstValidator;
 import com.google.gwt.thirdparty.javascript.rhino.IR;
 import com.google.gwt.thirdparty.javascript.rhino.InputId;
 import com.google.gwt.thirdparty.javascript.rhino.Node;
+import com.google.gwt.thirdparty.javascript.rhino.SimpleSourceFile;
+import com.google.gwt.thirdparty.javascript.rhino.StaticSourceFile;
 import com.google.gwt.thirdparty.javascript.rhino.Token;
-import com.google.gwt.thirdparty.javascript.rhino.jstype.SimpleSourceFile;
-import com.google.gwt.thirdparty.javascript.rhino.jstype.StaticSourceFile;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -98,7 +99,7 @@
     }
   }
 
-  private final Map<String, StaticSourceFile> sourceCache = new HashMap<String, StaticSourceFile>();
+  private final Map<String, StaticSourceFile> sourceCache = new HashMap<>();
 
   private final boolean validate;
   private final Set<String> globalVars = Sets.newHashSet();
@@ -107,10 +108,12 @@
   private final Set<String> externalVars = Sets.newHashSet();
 
   private final JsProgram program;
+  private final AbstractCompiler compiler;
 
-  ClosureJsAstTranslator(boolean validate, JsProgram program) {
+  ClosureJsAstTranslator(boolean validate, JsProgram program, AbstractCompiler compiler) {
     this.program = program;
     this.validate = validate;
+    this.compiler = compiler;
   }
 
   public Node translate(JsProgramFragment fragment, InputId inputId, String source) {
@@ -123,7 +126,7 @@
     }
     // Validate the structural integrity of the AST.
     if (validate) {
-      new AstValidator().validateScript(script);
+      new AstValidator(compiler).validateScript(script);
     }
     return script;
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java
index 365096d..01a6f0d 100644
--- a/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java
+++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java
@@ -34,10 +34,10 @@
 import com.google.gwt.thirdparty.javascript.jscomp.DiagnosticGroups;
 import com.google.gwt.thirdparty.javascript.jscomp.JSError;
 import com.google.gwt.thirdparty.javascript.jscomp.JSModule;
-import com.google.gwt.thirdparty.javascript.jscomp.JSSourceFile;
 import com.google.gwt.thirdparty.javascript.jscomp.PropertyRenamingPolicy;
 import com.google.gwt.thirdparty.javascript.jscomp.Result;
 import com.google.gwt.thirdparty.javascript.jscomp.SourceAst;
+import com.google.gwt.thirdparty.javascript.jscomp.SourceFile;
 import com.google.gwt.thirdparty.javascript.jscomp.VariableMap;
 import com.google.gwt.thirdparty.javascript.jscomp.VariableRenamingPolicy;
 import com.google.gwt.thirdparty.javascript.jscomp.WarningLevel;
@@ -47,7 +47,7 @@
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.text.ParseException;
+import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -99,7 +99,7 @@
    * @return a mutable list
    * @throws IOException
    */
-  public static List<JSSourceFile> getDefaultExterns() throws IOException {
+  public static List<SourceFile> getDefaultExterns() throws IOException {
     Class<ClosureJsRunner> clazz = ClosureJsRunner.class;
     InputStream input = clazz.getResourceAsStream("/com/google/javascript/jscomp/externs.zip");
     if (input == null) {
@@ -110,14 +110,14 @@
       input = clazz.getResourceAsStream("/externs.zip");
     }
     ZipInputStream zip = new ZipInputStream(input);
-    Map<String, JSSourceFile> externsMap = Maps.newHashMap();
+    Map<String, SourceFile> externsMap = Maps.newHashMap();
     for (ZipEntry entry = null; (entry = zip.getNextEntry()) != null;) {
       BufferedInputStream entryStream =
           new BufferedInputStream(ByteStreams.limit(zip, entry.getSize()));
-      externsMap.put(entry.getName(), JSSourceFile.fromInputStream(
+      externsMap.put(entry.getName(), SourceFile.fromInputStream(
       // Give the files an odd prefix, so that they do not conflict
       // with the user's files.
-          "externs.zip//" + entry.getName(), entryStream));
+          "externs.zip//" + entry.getName(), entryStream, Charset.defaultCharset()));
     }
 
     Preconditions.checkState(externsMap.keySet().equals(Sets.newHashSet(DEFAULT_EXTERNS_NAMES)),
@@ -125,7 +125,7 @@
 
     // Order matters, so the resources must be added to the result list
     // in the expected order.
-    List<JSSourceFile> externs = Lists.newArrayList();
+    List<SourceFile> externs = Lists.newArrayList();
     for (String key : DEFAULT_EXTERNS_NAMES) {
       externs.add(externsMap.get(key));
     }
@@ -176,11 +176,8 @@
   public void compile(JProgram jprogram, JsProgram program, String[] js,
       JsOutputOption jsOutputOption) {
     CompilerOptions options;
-    try {
-      options = getClosureCompilerOptions(jsOutputOption);
-    } catch (ParseException e) {
-      throw new RuntimeException("Error setting closure compiler options", e);
-    }
+    options = getClosureCompilerOptions(jsOutputOption);
+
     // Turn off Closure Compiler logging
     Logger.getLogger("com.google.gwt.thirdparty.javascript.jscomp").setLevel(Level.OFF);
 
@@ -192,7 +189,7 @@
     List<JSModule> modules = createClosureModules(program);
 
     // Build the externs based on what we discovered building the modules.
-    List<JSSourceFile> externs = getClosureCompilerExterns();
+    List<SourceFile> externs = getClosureCompilerExterns();
 
     Result result = compiler.compileModules(externs, modules, options);
     if (result.success) {
@@ -209,8 +206,8 @@
     }
   }
 
-  protected List<JSSourceFile> getDefaultExternsList() {
-    List<JSSourceFile> defaultExterns;
+  protected List<SourceFile> getDefaultExternsList() {
+    List<SourceFile> defaultExterns;
     try {
       defaultExterns = getDefaultExterns();
       return defaultExterns;
@@ -275,7 +272,7 @@
       String source) {
     String inputName = source;
     InputId inputId = new InputId(inputName);
-    ClosureJsAstTranslator translator = new ClosureJsAstTranslator(validate, program);
+    ClosureJsAstTranslator translator = new ClosureJsAstTranslator(validate, program, compiler);
     Node root = translator.translate(fragment, inputId, source);
     globalVars.addAll(translator.getGlobalVariableNames());
     externalProps.addAll(translator.getExternalPropertyReferences());
@@ -315,14 +312,14 @@
         modules[i].addDependency(leftovers);
       }
     }
-    modules[0].add(JSSourceFile.fromCode("hack", "window['gwtOnLoad'] = gwtOnLoad;\n"));
+    modules[0].add(SourceFile.fromCode("hack", "window['gwtOnLoad'] = gwtOnLoad;\n"));
 
     return Arrays.asList(modules);
   }
 
-  private List<JSSourceFile> getClosureCompilerExterns() {
-    List<JSSourceFile> externs = getDefaultExternsList();
-    externs.add(JSSourceFile.fromCode("gwt_externs",
+  private List<SourceFile> getClosureCompilerExterns() {
+    List<SourceFile> externs = getDefaultExternsList();
+    externs.add(SourceFile.fromCode("gwt_externs",
 
     "var gwtOnLoad;\n"
         + "var $entry;\n"
@@ -356,13 +353,12 @@
       generatedExterns += "var " + var + ";\n";
     }
 
-    externs.add(JSSourceFile.fromCode("gwt_generated_externs", generatedExterns));
+    externs.add(SourceFile.fromCode("gwt_generated_externs", generatedExterns));
 
     return externs;
   }
 
-  private CompilerOptions getClosureCompilerOptions(JsOutputOption jsOutputOption)
-      throws ParseException {
+  private CompilerOptions getClosureCompilerOptions(JsOutputOption jsOutputOption) {
     CompilerOptions options = new CompilerOptions();
     WarningLevel.QUIET.setOptionsForWarningLevel(options);
 
@@ -370,11 +366,11 @@
 
     // Build an identity map of variable names to prevent GWT names from
     // being renamed while allowing new global variables to be renamed.
-    HashMap<String, String> varNames = new HashMap<String, String>();
+    HashMap<String, String> varNames = new HashMap<>();
     for (String var : globalVars) {
       varNames.put(var, var);
     }
-    options.setInputVariableMapSerialized(VariableMap.fromMap(varNames).toBytes());
+    options.setInputVariableMap(VariableMap.fromMap(varNames));
     if (jsOutputOption == JsOutputOption.OBFUSCATED) {
       options.setRenamingPolicy(VariableRenamingPolicy.ALL, PropertyRenamingPolicy.OFF);
       options.setPrettyPrint(false);
@@ -412,7 +408,7 @@
     options.setFlowSensitiveInlineVariables(true);
     options.setComputeFunctionSideEffects(true);
     // Remove unused vars also removes unused functions.
-    options.setRemoveUnusedVariable(Reach.ALL);
+    options.setRemoveUnusedVariables(Reach.ALL);
     options.setOptimizeParameters(true);
     options.setOptimizeReturns(true);
     options.setOptimizeCalls(true);
@@ -425,7 +421,6 @@
 
     // Advanced optimization, disabled
     options.setRemoveClosureAsserts(false);
-    options.setAliasKeywords(false);
     options.setRemoveUnusedPrototypePropertiesInExterns(false);
     options.setCheckGlobalThisLevel(CheckLevel.OFF);
     options.setRewriteFunctionExpressions(false); // Performance hit
diff --git a/eclipse/dev/.classpath b/eclipse/dev/.classpath
index 4419743..1e421b3 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -23,8 +23,8 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-2.19/htmlunit-core-js-2.15.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/protobuf/protobuf-2.5.0/protobuf-java-rebased-2.5.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-18.0/guava-18.0-rebased.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20131118.json.rebased/compiler-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20160315/sourcemap-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20160315/compiler-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/json/android-sdk-19.1/json-android-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/apache/commons/commons-collections-3.2.2.jar"/>
 	<classpathentry exported="true" kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-servlet-api-8.0.28.jar"/>
diff --git a/eclipse/dev/codeserver/.classpath b/eclipse/dev/codeserver/.classpath
index 96354aa..34c26c9 100644
--- a/eclipse/dev/codeserver/.classpath
+++ b/eclipse/dev/codeserver/.classpath
@@ -4,8 +4,8 @@
 	<classpathentry kind="src" path="codeserver/javatests"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-18.0/guava-18.0-rebased.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20131118.json.rebased/compiler-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20160315/sourcemap-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20160315/compiler-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/junit/junit-4.8.2.jar" sourcepath="/GWT_TOOLS/lib/junit/junit-4.8.2-src.zip"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-dev"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index f4db2ad..4179dd4 100644
--- a/eclipse/user/.classpath
+++ b/eclipse/user/.classpath
@@ -60,7 +60,7 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/testng/testng-5.14.1-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/testng/testng-5.14.1-nojunit.jar" sourcepath="/GWT_TOOLS/lib/testng/testng-5.14.1-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/protobuf/protobuf-2.5.0/protobuf-java-rebased-2.5.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20131118.json.rebased/sourcemap-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/20160315/sourcemap-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/eclipse/org.eclipse.jdt.core_3.11.2-CUSTOM-GWT-2.8-20160205.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/eclipse/jdtCompilerAdapter_3.11.2-CUSTOM-GWT-2.8-20160205.jar"/>
 	<classpathentry kind="output" path="bin"/>
diff --git a/servlet/build.xml b/servlet/build.xml
index 7ea16fa..b06bb4a 100644
--- a/servlet/build.xml
+++ b/servlet/build.xml
@@ -26,7 +26,7 @@
       <!-- Rebased dependencies go in gwt-servlet too -->
       <zipfileset src="${gwt.tools.lib}/colt/colt-1.2.jar" />
       <zipfileset src="${gwt.tools.lib}/guava/guava-18.0/guava-18.0-rebased.jar" />
-      <zipfileset src="${gwt.tools.lib}/jscomp/20131118.json.rebased/sourcemap-rebased.jar" />
+      <zipfileset src="${gwt.tools.lib}/jscomp/20160315/sourcemap-rebased.jar" />
       <zipfileset src="${gwt.tools.lib}/json/android-sdk-19.1/json-android-rebased.jar" />
       <zipfileset src="${gwt.tools.lib}/streamhtmlparser/streamhtmlparser-jsilver-r10/streamhtmlparser-jsilver-r10-1.5-rebased.jar" />
       <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.5.0/protobuf-java-rebased-2.5.0.jar" />
