diff --git a/DEPS b/DEPS
index 780508f..ea121a0 100644
--- a/DEPS
+++ b/DEPS
@@ -38,7 +38,7 @@
 
   # Revisions of /third_party/* dependencies.
   "7zip_rev" : "@19997",
-  "analyzer_cli_rev" : "@af40be0e3cc0b9904151a45e8074a8e797443cb6",
+  "analyzer_cli_rev" : "@c7a22746baaa8ee6b3e6b0378f9ad9de6e486186",
   "args_tag": "@0.13.0",
   "async_tag": "@1.2.0",
   "barback_tag" : "@0.15.2+7",
@@ -51,7 +51,7 @@
   "crypto_rev" : "@2df57a1e26dd88e8d0614207d4b062c73209917d",
   "csslib_tag" : "@0.12.0",
   "dart2js_info_rev" : "@c4ad464717e3a304fb0d44a6937c25ff2049b863",
-  "dartdoc_rev" : "@61bfb136ec1d314b977cfbfdbc79097243632ccf",
+  "dartdoc_rev" : "@02a94ec329ab8b5767e0d20f6585b9cf5c937c73",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
   "dart_style_tag": "@0.2.0",
   "dev_compiler_rev": "@0.1.9",
@@ -68,7 +68,7 @@
   "intl_rev": "@32047558bd220a53c1f4d93a26d54b83533b1475",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@1.1.1",
-  "linter_rev": "@23ec957be86263c3c5ac6bdaeb463170ea5fb00d",
+  "linter_rev": "@4bc38ed44073e9a87b7f5adf333fb24f86e476a2",
   "logging_rev": "@85d83e002670545e9039ad3985f0018ab640e597",
   "markdown_rev": "@4aaadf3d940bb172e1f6285af4d2b1710d309982",
   "matcher_tag": "@0.12.0",
diff --git a/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart b/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
index 8c5d595..3d18865 100644
--- a/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/analysis_timing_tests.dart
@@ -9,7 +9,6 @@
 
 import 'package:analysis_server/plugin/protocol/protocol.dart';
 import 'package:args/args.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../test/utils.dart';
@@ -34,11 +33,15 @@
   metricNames.addAll(args[METRIC_NAME_OPTION]);
   unittestConfiguration.timeout = new Duration(minutes: 20);
 
+  var test;
+
   if (metricNames.isEmpty) {
-    defineReflectiveTests(AnalysisTimingTest);
+    test = new AnalysisTimingTest();
   } else {
-    defineReflectiveTests(SubscriptionTimingTest);
+    test = new SubscriptionTimingTest();
   }
+
+  Future.wait([test.test_timing()]);
 }
 
 const DEFAULT_METRIC = 'analysis';
@@ -57,25 +60,23 @@
   ..addOption(PRIORITY_FILE_OPTION,
       help: '(optional) full path to a priority file');
 
-class AbstractTimingTest extends AbstractAnalysisServerPerformanceTest {
-  @override
-  Future setUp() => super.setUp().then((_) {
-        sourceDirectory = new Directory(source);
-        subscribeToStatusNotifications();
-      });
-}
-
-@reflectiveTest
+/**
+ * AnalysisTimingTest measures the time taken by the analsyis server to fully analyze
+ * the given directory. Measurement is started after setting the analysis root, and
+ * analysis is considered complete on receiving the `"isAnalyzing": false` message
+ * from the analysis server.
+ */
 class AnalysisTimingTest extends AbstractTimingTest {
-  Future test_timing() {
+  Future test_timing() async {
     // Set root after subscribing to avoid empty notifications.
-    setAnalysisRoot();
+    await init(source);
 
+    setAnalysisRoot();
     stopwatch.start();
-    return analysisFinished.then((_) {
-      print('analysis completed in ${stopwatch.elapsed}');
-      stopwatch.reset();
-    });
+    await analysisFinished;
+    print('analysis completed in ${stopwatch.elapsed}');
+
+    await shutdown();
   }
 }
 
@@ -88,7 +89,14 @@
   String toString() => '$name: $service, ${eventStream.runtimeType}, $timings';
 }
 
-@reflectiveTest
+/**
+ * SubscriptionTimingTest measures the time taken by the analysis server to return
+ * information for navigation, semantic highlighting, outline, get occurances,
+ * overrides, folding and implemented. These timings are wrt to the specified priority file
+ * - the file that is currently opened and has focus in the editor. Measure the time from
+ * when the client subscribes for the notifications till there is a response from the server.
+ * Does not wait for analysis to be complete before subscribing for notifications.
+ */
 class SubscriptionTimingTest extends AbstractTimingTest {
   List<Metric> _metrics;
 
@@ -121,7 +129,7 @@
     return null; // Won't get here.
   }
 
-  Future test_timing() {
+  Future test_timing() async {
 //   debugStdio();
 
     expect(metrics, isNotEmpty);
@@ -129,6 +137,7 @@
         reason: 'A priority file must be specified for '
             '${metrics.first.name} testing.');
 
+    await init(source);
     stopwatch.start();
 
     metrics.forEach((Metric m) => m.eventStream.listen((_) {
@@ -146,10 +155,10 @@
 
     sendAnalysisSetPriorityFiles([priorityFile]);
 
-    return analysisFinished.then((_) {
-      print('analysis completed in ${stopwatch.elapsed}');
-      metrics.forEach((Metric m) => print('${m.name} timings: ${m.timings}'));
-      stopwatch.reset();
-    });
+    await analysisFinished;
+    print('analysis completed in ${stopwatch.elapsed}');
+    metrics.forEach((Metric m) => print('${m.name} timings: ${m.timings}'));
+
+    await shutdown();
   }
 }
diff --git a/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart b/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
index 6ff587a..f28ccf4 100644
--- a/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
@@ -8,7 +8,6 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../test/utils.dart';
@@ -29,11 +28,9 @@
   }
   source = args[SOURCE_OPTION];
   priorityFile = args[PRIORITY_FILE_OPTION];
-  offset = args[COMPLETION_OFFSET];
+  offset = int.parse(args[COMPLETION_OFFSET]);
 
-  unittestConfiguration.timeout = new Duration(minutes: 20);
-
-  defineReflectiveTests(CompletionTimingTest);
+  Future.wait([new CompletionTimingTest().test_timing()]);
 }
 
 const PRIORITY_FILE_OPTION = 'priority';
@@ -49,17 +46,17 @@
   ..addOption(PRIORITY_FILE_OPTION, help: 'full path to a priority file')
   ..addOption(COMPLETION_OFFSET, help: 'offset in file for code completions');
 
-@reflectiveTest
-class CompletionTimingTest extends AbstractAnalysisServerPerformanceTest {
+/**
+ * CompletionTimingTest measures the time taken for the analysis server to respond with
+ * completion suggestions for a given file and offset. The time measured starts when
+ * the analysis root is set and is done when the completion suggestions are received
+ * from the server. The test does not wait for analysis to be complete before asking for
+ * completions.
+ */
+class CompletionTimingTest extends AbstractTimingTest {
   List<Duration> timings = <Duration>[];
 
-  @override
-  Future setUp() => super.setUp().then((_) {
-        sourceDirectory = new Directory(source);
-        subscribeToStatusNotifications();
-      });
-
-  Future test_timing() {
+  Future test_timing() async {
 //    debugStdio();
 
     expect(priorityFile, isNotNull,
@@ -67,6 +64,7 @@
     expect(offset, isNotNull,
         reason: 'An offset must be specified for completion testing.');
 
+    await init(source);
     stopwatch.start();
 
     onCompletionResults.listen((_) {
@@ -77,10 +75,10 @@
     sendAnalysisSetPriorityFiles([priorityFile]);
     sendCompletionGetSuggestions(priorityFile, offset);
 
-    return analysisFinished.then((_) {
-      print('analysis completed in ${stopwatch.elapsed}');
-      timings.forEach((timing) => print('notification at : ${timings}'));
-      stopwatch.reset();
-    });
+    await analysisFinished;
+
+    print('analysis completed in ${stopwatch.elapsed}');
+    print('completion received at : ${timings}');
+    await shutdown();
   }
 }
diff --git a/pkg/analysis_server/benchmark/perf/performance_tests.dart b/pkg/analysis_server/benchmark/perf/performance_tests.dart
index 761c647..62a752c 100644
--- a/pkg/analysis_server/benchmark/perf/performance_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/performance_tests.dart
@@ -5,6 +5,7 @@
 library server.performance;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:analysis_server/plugin/protocol/protocol.dart';
 import 'package:unittest/unittest.dart';
@@ -67,6 +68,13 @@
   /**
    * After every test, the server is stopped.
    */
-  @override
-  Future tearDown() => shutdownIfNeeded();
+  Future shutdown() async => await shutdownIfNeeded();
+}
+
+class AbstractTimingTest extends AbstractAnalysisServerPerformanceTest {
+  Future init(String source) async {
+    await super.setUp();
+    sourceDirectory = new Directory(source);
+    return subscribeToStatusNotifications();
+  }
 }
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 69a9f87..707246a 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1248,7 +1248,7 @@
   }
 }</pre></div>
         <p>
-          Reports the overridding members in a file.
+          Reports the overriding members in a file.
         </p>
         <p>
           This notification is not subscribed to by default. Clients
@@ -2048,7 +2048,7 @@
           If directives of the Dart file cannot be organized, for example
           because it has scan or parse errors, or by other reasons,
           <tt>ORGANIZE_DIRECTIVES_ERROR</tt> will be generated. The message
-          will provide datails about the reason.
+          will provide details about the reason.
         </p>
         
         
@@ -2458,7 +2458,7 @@
           </dd><dt class="field"><b><i>enableSuperMixins ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
             <p>
-              True if the client wants to enable spport for the
+              True if the client wants to enable support for the
               proposed "less restricted mixins" proposal (DEP 34).
             </p>
           </dd><dt class="field"><b><i>generateDart2jsHints ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
@@ -2776,7 +2776,7 @@
           An enumeration of the kinds of elements.
         </p>
         
-      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
+      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
         <p>
           A description of an executable file.
         </p>
@@ -3030,14 +3030,14 @@
       <dl><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
             
             <p>
-              The offset of the range of characters that encompases the
+              The offset of the range of characters that encompasses the
               cursor position and has the same hover information as the
               cursor position.
             </p>
           </dd><dt class="field"><b><i>length ( int )</i></b></dt><dd>
             
             <p>
-              The length of the range of characters that encompases the
+              The length of the range of characters that encompasses the
               cursor position and has the same hover information as the
               cursor position.
             </p>
@@ -3667,7 +3667,7 @@
             <p>
               A request was received which the analysis server does
               not recognize, or cannot handle in its current
-              configuation.
+              configuration.
             </p>
           </dd><dt class="value">UNKNOWN_SOURCE</dt><dd>
             
diff --git a/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart b/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
index feca11a..821a81e 100644
--- a/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
+++ b/pkg/analysis_server/lib/plugin/analysis/analysis_domain.dart
@@ -57,7 +57,7 @@
  * An object that gives plugins access to the analysis domain of the analysis
  * server.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class AnalysisDomain {
   /**
diff --git a/pkg/analysis_server/lib/plugin/analysis/navigation/navigation_core.dart b/pkg/analysis_server/lib/plugin/analysis/navigation/navigation_core.dart
index 4626ffa..dea288b 100644
--- a/pkg/analysis_server/lib/plugin/analysis/navigation/navigation_core.dart
+++ b/pkg/analysis_server/lib/plugin/analysis/navigation/navigation_core.dart
@@ -12,7 +12,7 @@
 /**
  * An object that [NavigationContributor]s use to record navigation regions.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class NavigationCollector {
   /**
@@ -26,7 +26,7 @@
 /**
  * An object used to produce navigation regions.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class NavigationContributor {
   /**
diff --git a/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart b/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
index eebf54e..ac56afd 100644
--- a/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
+++ b/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
@@ -12,7 +12,7 @@
 /**
  * An object that [OccurrencesContributor]s use to record occurrences into.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class OccurrencesCollector {
   /**
@@ -24,7 +24,7 @@
 /**
  * An object used to produce occurrences.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class OccurrencesContributor {
   /**
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
index 08bad09..d4903e6 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -12,7 +12,7 @@
 /**
  * A description of a single proposed assist.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Assist {
   /**
@@ -52,7 +52,7 @@
 /**
  * An object used to produce assists for a specific location.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class AssistContributor {
   /**
@@ -70,7 +70,7 @@
  * information that is common across a number of assists and to be shared by
  * those assists.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AssistKind {
   /**
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
index 737b3c4..ccdc123 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
@@ -13,9 +13,9 @@
  * An [AssistContributor] that can be used to contribute assists for Dart
  * files.
  *
- * Clients are expected to extend this class when implementing plugins.
+ * Clients may extend this class when implementing plugins.
  */
-abstract class DartAssistContributor extends AssistContributor {
+abstract class DartAssistContributor implements AssistContributor {
   @override
   List<Assist> computeAssists(
       AnalysisContext context, Source source, int offset, int length) {
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
index 1bdfc38..123fa24 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
@@ -13,7 +13,7 @@
 /**
  * A description of a single proposed fix for some problem.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Fix {
   /**
@@ -55,7 +55,7 @@
  * long-lived objects and must not retain any state between invocations of
  * [computeFixes].
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class FixContributor {
   /**
@@ -74,7 +74,7 @@
  * a single file, then there will be multiple fixes, one per occurance, but they
  * will all share the same kind.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class FixKind {
   /**
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index efcdcab..54baa7c 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -15,9 +15,9 @@
  * A [FixContributor] that can be used to contribute fixes for errors in Dart
  * files.
  *
- * Clients are expected to extend this class when implementing plugins.
+ * Clients may extend this class when implementing plugins.
  */
-abstract class DartFixContributor extends FixContributor {
+abstract class DartFixContributor implements FixContributor {
   @override
   List<Fix> computeFixes(ResourceProvider resourceProvider,
       AnalysisContext context, AnalysisError error) {
diff --git a/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_core.dart b/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_core.dart
index 8895f0e..8c35743 100644
--- a/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_core.dart
@@ -11,7 +11,7 @@
 /**
  * A builder used to build a [SourceChange].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class ChangeBuilder {
   /**
@@ -37,7 +37,7 @@
 /**
  * A builder used to build a [SourceEdit] as part of a [SourceFileEdit].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class EditBuilder {
   /**
@@ -64,7 +64,7 @@
 /**
  * A builder used to build a [SourceFileEdit] within a [SourceChange].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class FileEditBuilder {
   /**
@@ -97,7 +97,7 @@
 /**
  * A builder used to build a [LinkedEdit] region within an edit.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class LinkedEditBuilder {
   /**
diff --git a/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_dart.dart b/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_dart.dart
index e79204b..7d0e0c7 100644
--- a/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/utilities/change_builder_dart.dart
@@ -13,7 +13,7 @@
 /**
  * A [ChangeBuilder] used to build changes in Dart files.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class DartChangeBuilder extends ChangeBuilder {
   /**
@@ -25,7 +25,7 @@
 /**
  * An [EditBuilder] used to build edits in Dart files.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class DartEditBuilder extends EditBuilder {
   /**
@@ -151,6 +151,6 @@
 /**
  * A [FileEditBuilder] used to build edits for Dart files.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class DartFileEditBuilder extends FileEditBuilder {}
diff --git a/pkg/analysis_server/lib/plugin/index/index_core.dart b/pkg/analysis_server/lib/plugin/index/index_core.dart
index 98fde3e..6e927a5 100644
--- a/pkg/analysis_server/lib/plugin/index/index_core.dart
+++ b/pkg/analysis_server/lib/plugin/index/index_core.dart
@@ -24,37 +24,37 @@
 /**
  * An object that can have a [Relationship] with various [Location]s in a code
  * base. The object is abstractly represented by a [kind] and an [offset] within
- * a [source].
+ * a file with the [filePath].
  *
  * Clients must ensure that two distinct objects in the same source cannot have
  * the same kind and offset. Failure to do so will make it impossible for
  * clients to identify the model element corresponding to the indexable object.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class IndexableObject {
   /**
+   * Return the absolute path of the file containing the indexable object.
+   */
+  String get filePath;
+
+  /**
    * Return the kind of this object.
    */
   IndexableObjectKind get kind;
 
   /**
-   * Return the offset of the indexable object within its source.
+   * Return the offset of the indexable object within its file.
    */
   int get offset;
-
-  /**
-   * Return the source containing the indexable object.
-   */
-  Source get source;
 }
 
 /**
  * The kind associated with an [IndexableObject].
  *
- * Clients are expected to implement this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
-abstract class IndexableObjectKind {
+abstract class IndexableObjectKind<T extends IndexableObject> {
   /**
    * The next available index for a newly created kind of indexable object.
    */
@@ -84,7 +84,7 @@
    * [context], in the source with the given [filePath], and at the given
    * [offset].
    */
-  IndexableObject decode(AnalysisContext context, String filePath, int offset);
+  T decode(AnalysisContext context, String filePath, int offset);
 
   /**
    * Returns the hash value that corresponds to the given [indexable].
@@ -105,7 +105,7 @@
    * object does not have a name, some other value may be returned, but it still
    * must be always the same for the same object and have good selectivity.
    */
-  int encodeHash(StringToInt stringToInt, IndexableObject indexable);
+  int encodeHash(StringToInt stringToInt, T indexable);
 
   /**
    * Return the object kind with the given [index].
@@ -131,7 +131,7 @@
 /**
  * An object used to add relationships to the index.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class IndexContributor {
   /**
@@ -145,7 +145,7 @@
  * An object that stores information about the relationships between locations
  * in a code base.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class IndexStore {
   /**
@@ -228,7 +228,7 @@
  * to the source containing the indexable object rather than the start of the
  * indexable object within that source.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class Location {
   /**
@@ -267,7 +267,7 @@
  * A relationship between an indexable object and a location. Relationships are
  * identified by a globally unique identifier.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class Relationship {
   /**
diff --git a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
index 4a07f0a..db3e626 100644
--- a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
@@ -11,7 +11,7 @@
 /**
  * server.getVersion params
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerGetVersionParams {
   Request toRequest(String id) {
@@ -39,7 +39,7 @@
  *   "version": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerGetVersionResult implements HasToJson {
   String _version;
@@ -114,7 +114,7 @@
 /**
  * server.shutdown params
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerShutdownParams {
   Request toRequest(String id) {
@@ -137,7 +137,7 @@
 /**
  * server.shutdown result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerShutdownResult {
   Response toResponse(String id) {
@@ -165,7 +165,7 @@
  *   "subscriptions": List<ServerService>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerSetSubscriptionsParams implements HasToJson {
   List<ServerService> _subscriptions;
@@ -240,7 +240,7 @@
 /**
  * server.setSubscriptions result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerSetSubscriptionsResult {
   Response toResponse(String id) {
@@ -268,7 +268,7 @@
  *   "version": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerConnectedParams implements HasToJson {
   String _version;
@@ -350,7 +350,7 @@
  *   "stackTrace": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerErrorParams implements HasToJson {
   bool _isFatal;
@@ -485,7 +485,7 @@
  *   "pub": optional PubStatus
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerStatusParams implements HasToJson {
   AnalysisStatus _analysis;
@@ -592,7 +592,7 @@
  *   "file": FilePath
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetErrorsParams implements HasToJson {
   String _file;
@@ -672,7 +672,7 @@
  *   "errors": List<AnalysisError>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetErrorsResult implements HasToJson {
   List<AnalysisError> _errors;
@@ -753,7 +753,7 @@
  *   "offset": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetHoverParams implements HasToJson {
   String _file;
@@ -858,7 +858,7 @@
  *   "hovers": List<HoverInformation>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetHoverResult implements HasToJson {
   List<HoverInformation> _hovers;
@@ -941,7 +941,7 @@
 /**
  * analysis.getLibraryDependencies params
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetLibraryDependenciesParams {
   Request toRequest(String id) {
@@ -970,7 +970,7 @@
  *   "packageMap": Map<String, Map<String, List<FilePath>>>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetLibraryDependenciesResult implements HasToJson {
   List<String> _libraries;
@@ -1081,7 +1081,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetNavigationParams implements HasToJson {
   String _file;
@@ -1217,7 +1217,7 @@
  *   "regions": List<NavigationRegion>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisGetNavigationResult implements HasToJson {
   List<String> _files;
@@ -1351,7 +1351,7 @@
  *   "roots": optional List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisReanalyzeParams implements HasToJson {
   List<String> _roots;
@@ -1425,7 +1425,7 @@
 /**
  * analysis.reanalyze result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisReanalyzeResult {
   Response toResponse(String id) {
@@ -1455,7 +1455,7 @@
  *   "packageRoots": optional Map<FilePath, FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetAnalysisRootsParams implements HasToJson {
   List<String> _included;
@@ -1603,7 +1603,7 @@
 /**
  * analysis.setAnalysisRoots result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetAnalysisRootsResult {
   Response toResponse(String id) {
@@ -1631,7 +1631,7 @@
  *   "subscriptions": List<GeneralAnalysisService>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetGeneralSubscriptionsParams implements HasToJson {
   List<GeneralAnalysisService> _subscriptions;
@@ -1706,7 +1706,7 @@
 /**
  * analysis.setGeneralSubscriptions result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetGeneralSubscriptionsResult {
   Response toResponse(String id) {
@@ -1734,7 +1734,7 @@
  *   "files": List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetPriorityFilesParams implements HasToJson {
   List<String> _files;
@@ -1809,7 +1809,7 @@
 /**
  * analysis.setPriorityFiles result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetPriorityFilesResult {
   Response toResponse(String id) {
@@ -1837,7 +1837,7 @@
  *   "subscriptions": Map<AnalysisService, List<FilePath>>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetSubscriptionsParams implements HasToJson {
   Map<AnalysisService, List<String>> _subscriptions;
@@ -1914,7 +1914,7 @@
 /**
  * analysis.setSubscriptions result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisSetSubscriptionsResult {
   Response toResponse(String id) {
@@ -1942,7 +1942,7 @@
  *   "files": Map<FilePath, AddContentOverlay | ChangeContentOverlay | RemoveContentOverlay>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisUpdateContentParams implements HasToJson {
   Map<String, dynamic> _files;
@@ -2023,7 +2023,7 @@
  * {
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisUpdateContentResult implements HasToJson {
   AnalysisUpdateContentResult();
@@ -2078,7 +2078,7 @@
  *   "options": AnalysisOptions
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisUpdateOptionsParams implements HasToJson {
   AnalysisOptions _options;
@@ -2153,7 +2153,7 @@
 /**
  * analysis.updateOptions result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisUpdateOptionsResult {
   Response toResponse(String id) {
@@ -2181,7 +2181,7 @@
  *   "directories": List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisAnalyzedFilesParams implements HasToJson {
   List<String> _directories;
@@ -2262,7 +2262,7 @@
  *   "errors": List<AnalysisError>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisErrorsParams implements HasToJson {
   String _file;
@@ -2367,7 +2367,7 @@
  *   "files": List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisFlushResultsParams implements HasToJson {
   List<String> _files;
@@ -2448,7 +2448,7 @@
  *   "regions": List<FoldingRegion>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisFoldingParams implements HasToJson {
   String _file;
@@ -2554,7 +2554,7 @@
  *   "regions": List<HighlightRegion>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisHighlightsParams implements HasToJson {
   String _file;
@@ -2669,7 +2669,7 @@
  *   "members": List<ImplementedMember>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisImplementedParams implements HasToJson {
   String _file;
@@ -2802,7 +2802,7 @@
  *   "delta": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisInvalidateParams implements HasToJson {
   String _file;
@@ -2964,7 +2964,7 @@
  *   "files": List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisNavigationParams implements HasToJson {
   String _file;
@@ -3136,7 +3136,7 @@
  *   "occurrences": List<Occurrences>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisOccurrencesParams implements HasToJson {
   String _file;
@@ -3244,7 +3244,7 @@
  *   "outline": Outline
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisOutlineParams implements HasToJson {
   String _file;
@@ -3407,7 +3407,7 @@
  *   "overrides": List<Override>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisOverridesParams implements HasToJson {
   String _file;
@@ -3513,7 +3513,7 @@
  *   "offset": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionGetSuggestionsParams implements HasToJson {
   String _file;
@@ -3618,7 +3618,7 @@
  *   "id": CompletionId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionGetSuggestionsResult implements HasToJson {
   String _id;
@@ -3702,7 +3702,7 @@
  *   "isLast": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionResultsParams implements HasToJson {
   String _id;
@@ -3904,7 +3904,7 @@
  *   "includePotential": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindElementReferencesParams implements HasToJson {
   String _file;
@@ -4039,7 +4039,7 @@
  *   "element": optional Element
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindElementReferencesResult implements HasToJson {
   String _id;
@@ -4154,7 +4154,7 @@
  *   "name": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindMemberDeclarationsParams implements HasToJson {
   String _name;
@@ -4234,7 +4234,7 @@
  *   "id": SearchId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindMemberDeclarationsResult implements HasToJson {
   String _id;
@@ -4314,7 +4314,7 @@
  *   "name": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindMemberReferencesParams implements HasToJson {
   String _name;
@@ -4394,7 +4394,7 @@
  *   "id": SearchId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindMemberReferencesResult implements HasToJson {
   String _id;
@@ -4474,7 +4474,7 @@
  *   "pattern": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindTopLevelDeclarationsParams implements HasToJson {
   String _pattern;
@@ -4556,7 +4556,7 @@
  *   "id": SearchId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchFindTopLevelDeclarationsResult implements HasToJson {
   String _id;
@@ -4638,7 +4638,7 @@
  *   "superOnly": optional bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchGetTypeHierarchyParams implements HasToJson {
   String _file;
@@ -4771,7 +4771,7 @@
  *   "hierarchyItems": optional List<TypeHierarchyItem>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchGetTypeHierarchyResult implements HasToJson {
   List<TypeHierarchyItem> _hierarchyItems;
@@ -4868,7 +4868,7 @@
  *   "isLast": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchResultsParams implements HasToJson {
   String _id;
@@ -5003,7 +5003,7 @@
  *   "lineLength": optional int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditFormatParams implements HasToJson {
   String _file;
@@ -5159,7 +5159,7 @@
  *   "selectionLength": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditFormatResult implements HasToJson {
   List<SourceEdit> _edits;
@@ -5293,7 +5293,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetAssistsParams implements HasToJson {
   String _file;
@@ -5423,7 +5423,7 @@
  *   "assists": List<SourceChange>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetAssistsResult implements HasToJson {
   List<SourceChange> _assists;
@@ -5505,7 +5505,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetAvailableRefactoringsParams implements HasToJson {
   String _file;
@@ -5635,7 +5635,7 @@
  *   "kinds": List<RefactoringKind>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetAvailableRefactoringsResult implements HasToJson {
   List<RefactoringKind> _kinds;
@@ -5716,7 +5716,7 @@
  *   "offset": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetFixesParams implements HasToJson {
   String _file;
@@ -5821,7 +5821,7 @@
  *   "fixes": List<AnalysisErrorFixes>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetFixesResult implements HasToJson {
   List<AnalysisErrorFixes> _fixes;
@@ -5906,7 +5906,7 @@
  *   "options": optional RefactoringOptions
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetRefactoringParams implements HasToJson {
   RefactoringKind _kind;
@@ -6127,7 +6127,7 @@
  *   "potentialEdits": optional List<String>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditGetRefactoringResult implements HasToJson {
   List<RefactoringProblem> _initialProblems;
@@ -6363,7 +6363,7 @@
  *   "file": FilePath
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditSortMembersParams implements HasToJson {
   String _file;
@@ -6443,7 +6443,7 @@
  *   "edit": SourceFileEdit
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditSortMembersResult implements HasToJson {
   SourceFileEdit _edit;
@@ -6525,7 +6525,7 @@
  *   "file": FilePath
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditOrganizeDirectivesParams implements HasToJson {
   String _file;
@@ -6605,7 +6605,7 @@
  *   "edit": SourceFileEdit
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class EditOrganizeDirectivesResult implements HasToJson {
   SourceFileEdit _edit;
@@ -6687,7 +6687,7 @@
  *   "contextRoot": FilePath
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionCreateContextParams implements HasToJson {
   String _contextRoot;
@@ -6769,7 +6769,7 @@
  *   "id": ExecutionContextId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionCreateContextResult implements HasToJson {
   String _id;
@@ -6849,7 +6849,7 @@
  *   "id": ExecutionContextId
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionDeleteContextParams implements HasToJson {
   String _id;
@@ -6924,7 +6924,7 @@
 /**
  * execution.deleteContext result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionDeleteContextResult {
   Response toResponse(String id) {
@@ -6954,7 +6954,7 @@
  *   "uri": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionMapUriParams implements HasToJson {
   String _id;
@@ -7083,7 +7083,7 @@
  *   "uri": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionMapUriResult implements HasToJson {
   String _file;
@@ -7190,7 +7190,7 @@
  *   "subscriptions": List<ExecutionService>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionSetSubscriptionsParams implements HasToJson {
   List<ExecutionService> _subscriptions;
@@ -7265,7 +7265,7 @@
 /**
  * execution.setSubscriptions result
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionSetSubscriptionsResult {
   Response toResponse(String id) {
@@ -7295,7 +7295,7 @@
  *   "referencedFiles": optional List<FilePath>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionLaunchDataParams implements HasToJson {
   String _file;
@@ -7430,7 +7430,7 @@
  *   "content": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AddContentOverlay implements HasToJson {
   String _content;
@@ -7511,7 +7511,7 @@
  *   "hasFix": optional bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisError implements HasToJson {
   AnalysisErrorSeverity _severity;
@@ -7726,7 +7726,7 @@
  *   "fixes": List<SourceChange>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisErrorFixes implements HasToJson {
   AnalysisError _error;
@@ -7828,7 +7828,7 @@
  *   ERROR
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisErrorSeverity implements Enum {
   static const INFO = const AnalysisErrorSeverity._("INFO");
@@ -7889,7 +7889,7 @@
  *   TODO
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisErrorType implements Enum {
   static const CHECKED_MODE_COMPILE_TIME_ERROR = const AnalysisErrorType._("CHECKED_MODE_COMPILE_TIME_ERROR");
@@ -7970,7 +7970,7 @@
  *   "generateLints": optional bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisOptions implements HasToJson {
   bool _enableAsync;
@@ -8058,13 +8058,13 @@
   }
 
   /**
-   * True if the client wants to enable spport for the proposed "less
+   * True if the client wants to enable support for the proposed "less
    * restricted mixins" proposal (DEP 34).
    */
   bool get enableSuperMixins => _enableSuperMixins;
 
   /**
-   * True if the client wants to enable spport for the proposed "less
+   * True if the client wants to enable support for the proposed "less
    * restricted mixins" proposal (DEP 34).
    */
   void set enableSuperMixins(bool value) {
@@ -8243,7 +8243,7 @@
  *   OVERRIDES
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisService implements Enum {
   static const FOLDING = const AnalysisService._("FOLDING");
@@ -8322,7 +8322,7 @@
  *   "analysisTarget": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisStatus implements HasToJson {
   bool _isAnalyzing;
@@ -8420,7 +8420,7 @@
  *   "edits": List<SourceEdit>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ChangeContentOverlay implements HasToJson {
   List<SourceEdit> _edits;
@@ -8514,7 +8514,7 @@
  *   "importUri": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionSuggestion implements HasToJson {
   CompletionSuggestionKind _kind;
@@ -9072,7 +9072,7 @@
  *   PARAMETER
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionSuggestionKind implements Enum {
   /**
@@ -9179,7 +9179,7 @@
  *   "typeParameters": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Element implements HasToJson {
   static const int FLAG_ABSTRACT = 0x01;
@@ -9455,6 +9455,7 @@
  *   ENUM
  *   ENUM_CONSTANT
  *   FIELD
+ *   FILE
  *   FUNCTION
  *   FUNCTION_TYPE_ALIAS
  *   GETTER
@@ -9472,7 +9473,7 @@
  *   UNKNOWN
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ElementKind implements Enum {
   static const CLASS = const ElementKind._("CLASS");
@@ -9489,6 +9490,8 @@
 
   static const FIELD = const ElementKind._("FIELD");
 
+  static const FILE = const ElementKind._("FILE");
+
   static const FUNCTION = const ElementKind._("FUNCTION");
 
   static const FUNCTION_TYPE_ALIAS = const ElementKind._("FUNCTION_TYPE_ALIAS");
@@ -9522,7 +9525,7 @@
   /**
    * A list containing all of the enum values that are defined.
    */
-  static const List<ElementKind> VALUES = const <ElementKind>[CLASS, CLASS_TYPE_ALIAS, COMPILATION_UNIT, CONSTRUCTOR, ENUM, ENUM_CONSTANT, FIELD, FUNCTION, FUNCTION_TYPE_ALIAS, GETTER, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, PARAMETER, PREFIX, SETTER, TOP_LEVEL_VARIABLE, TYPE_PARAMETER, UNIT_TEST_GROUP, UNIT_TEST_TEST, UNKNOWN];
+  static const List<ElementKind> VALUES = const <ElementKind>[CLASS, CLASS_TYPE_ALIAS, COMPILATION_UNIT, CONSTRUCTOR, ENUM, ENUM_CONSTANT, FIELD, FILE, FUNCTION, FUNCTION_TYPE_ALIAS, GETTER, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, PARAMETER, PREFIX, SETTER, TOP_LEVEL_VARIABLE, TYPE_PARAMETER, UNIT_TEST_GROUP, UNIT_TEST_TEST, UNKNOWN];
 
   final String name;
 
@@ -9544,6 +9547,8 @@
         return ENUM_CONSTANT;
       case "FIELD":
         return FIELD;
+      case "FILE":
+        return FILE;
       case "FUNCTION":
         return FUNCTION;
       case "FUNCTION_TYPE_ALIAS":
@@ -9603,7 +9608,7 @@
  *   "kind": ExecutableKind
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutableFile implements HasToJson {
   String _file;
@@ -9702,7 +9707,7 @@
  *   SERVER
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutableKind implements Enum {
   static const CLIENT = const ExecutableKind._("CLIENT");
@@ -9760,7 +9765,7 @@
  *   LAUNCH_DATA
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExecutionService implements Enum {
   static const LAUNCH_DATA = const ExecutionService._("LAUNCH_DATA");
@@ -9807,7 +9812,7 @@
  *   PART
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class FileKind implements Enum {
   static const LIBRARY = const FileKind._("LIBRARY");
@@ -9861,7 +9866,7 @@
  *   TOP_LEVEL_DECLARATION
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class FoldingKind implements Enum {
   static const COMMENT = const FoldingKind._("COMMENT");
@@ -9925,7 +9930,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class FoldingRegion implements HasToJson {
   FoldingKind _kind;
@@ -10046,7 +10051,7 @@
  *   ANALYZED_FILES
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class GeneralAnalysisService implements Enum {
   static const ANALYZED_FILES = const GeneralAnalysisService._("ANALYZED_FILES");
@@ -10094,7 +10099,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class HighlightRegion implements HasToJson {
   HighlightRegionType _type;
@@ -10287,7 +10292,7 @@
  *   VALID_STRING_ESCAPE
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class HighlightRegionType implements Enum {
   static const ANNOTATION = const HighlightRegionType._("ANNOTATION");
@@ -10778,7 +10783,7 @@
  *   "staticType": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class HoverInformation implements HasToJson {
   int _offset;
@@ -10804,13 +10809,13 @@
   String _staticType;
 
   /**
-   * The offset of the range of characters that encompases the cursor position
+   * The offset of the range of characters that encompasses the cursor position
    * and has the same hover information as the cursor position.
    */
   int get offset => _offset;
 
   /**
-   * The offset of the range of characters that encompases the cursor position
+   * The offset of the range of characters that encompasses the cursor position
    * and has the same hover information as the cursor position.
    */
   void set offset(int value) {
@@ -10819,13 +10824,13 @@
   }
 
   /**
-   * The length of the range of characters that encompases the cursor position
+   * The length of the range of characters that encompasses the cursor position
    * and has the same hover information as the cursor position.
    */
   int get length => _length;
 
   /**
-   * The length of the range of characters that encompases the cursor position
+   * The length of the range of characters that encompasses the cursor position
    * and has the same hover information as the cursor position.
    */
   void set length(int value) {
@@ -11129,7 +11134,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ImplementedClass implements HasToJson {
   int _offset;
@@ -11226,7 +11231,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ImplementedMember implements HasToJson {
   int _offset;
@@ -11324,7 +11329,7 @@
  *   "suggestions": List<LinkedEditSuggestion>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class LinkedEditGroup implements HasToJson {
   List<Position> _positions;
@@ -11468,7 +11473,7 @@
  *   "kind": LinkedEditSuggestionKind
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class LinkedEditSuggestion implements HasToJson {
   String _value;
@@ -11567,7 +11572,7 @@
  *   VARIABLE
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class LinkedEditSuggestionKind implements Enum {
   static const METHOD = const LinkedEditSuggestionKind._("METHOD");
@@ -11629,7 +11634,7 @@
  *   "startColumn": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Location implements HasToJson {
   String _file;
@@ -11806,7 +11811,7 @@
  *   "targets": List<int>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class NavigationRegion implements HasToJson {
   int _offset;
@@ -11936,7 +11941,7 @@
  *   "startColumn": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class NavigationTarget implements HasToJson {
   ElementKind _kind;
@@ -12140,7 +12145,7 @@
  *   "length": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Occurrences implements HasToJson {
   Element _element;
@@ -12264,7 +12269,7 @@
  *   "children": optional List<Outline>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Outline implements HasToJson {
   Element _element;
@@ -12420,7 +12425,7 @@
  *   "interfaceMembers": optional List<OverriddenMember>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Override implements HasToJson {
   int _offset;
@@ -12573,7 +12578,7 @@
  *   "className": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class OverriddenMember implements HasToJson {
   Element _element;
@@ -12670,7 +12675,7 @@
  *   "offset": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Position implements HasToJson {
   String _file;
@@ -12766,7 +12771,7 @@
  *   "isListingPackageDirs": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class PubStatus implements HasToJson {
   bool _isListingPackageDirs;
@@ -12847,7 +12852,7 @@
  *   SORT_MEMBERS
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringKind implements Enum {
   static const CONVERT_GETTER_TO_METHOD = const RefactoringKind._("CONVERT_GETTER_TO_METHOD");
@@ -12929,7 +12934,7 @@
  *   "parameters": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringMethodParameter implements HasToJson {
   String _id;
@@ -13105,7 +13110,7 @@
  * {
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringFeedback implements HasToJson {
   RefactoringFeedback();
@@ -13143,7 +13148,7 @@
  * {
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringOptions implements HasToJson {
   RefactoringOptions();
@@ -13184,7 +13189,7 @@
  *   NAMED
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringMethodParameterKind implements Enum {
   static const REQUIRED = const RefactoringMethodParameterKind._("REQUIRED");
@@ -13240,7 +13245,7 @@
  *   "location": optional Location
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringProblem implements HasToJson {
   RefactoringProblemSeverity _severity;
@@ -13367,7 +13372,7 @@
  *   FATAL
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RefactoringProblemSeverity implements Enum {
   static const INFO = const RefactoringProblemSeverity._("INFO");
@@ -13431,7 +13436,7 @@
  *   "type": "remove"
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RemoveContentOverlay implements HasToJson {
   RemoveContentOverlay();
@@ -13484,7 +13489,7 @@
  *   "stackTrace": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RequestError implements HasToJson {
   RequestErrorCode _code;
@@ -13627,7 +13632,7 @@
  *   UNSUPPORTED_FEATURE
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RequestErrorCode implements Enum {
   /**
@@ -13750,7 +13755,7 @@
 
   /**
    * A request was received which the analysis server does not recognize, or
-   * cannot handle in its current configuation.
+   * cannot handle in its current configuration.
    */
   static const UNKNOWN_REQUEST = const RequestErrorCode._("UNKNOWN_REQUEST");
 
@@ -13855,7 +13860,7 @@
  *   "path": List<Element>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchResult implements HasToJson {
   Location _location;
@@ -14017,7 +14022,7 @@
  *   WRITE
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SearchResultKind implements Enum {
   /**
@@ -14109,7 +14114,7 @@
  *   STATUS
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ServerService implements Enum {
   static const STATUS = const ServerService._("STATUS");
@@ -14158,7 +14163,7 @@
  *   "selection": optional Position
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SourceChange implements HasToJson {
   String _message;
@@ -14342,7 +14347,7 @@
  *   "id": optional String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SourceEdit implements HasToJson {
   /**
@@ -14520,7 +14525,7 @@
  *   "edits": List<SourceEdit>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class SourceFileEdit implements HasToJson {
   String _file;
@@ -14670,7 +14675,7 @@
  *   "subclasses": List<int>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class TypeHierarchyItem implements HasToJson {
   Element _classElement;
@@ -14917,7 +14922,7 @@
 /**
  * convertGetterToMethod feedback
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ConvertGetterToMethodFeedback {
   @override
@@ -14936,7 +14941,7 @@
 /**
  * convertGetterToMethod options
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ConvertGetterToMethodOptions {
   @override
@@ -14955,7 +14960,7 @@
 /**
  * convertMethodToGetter feedback
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ConvertMethodToGetterFeedback {
   @override
@@ -14974,7 +14979,7 @@
 /**
  * convertMethodToGetter options
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ConvertMethodToGetterOptions {
   @override
@@ -15002,7 +15007,7 @@
  *   "lengths": List<int>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExtractLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
   List<int> _coveringExpressionOffsets;
@@ -15186,7 +15191,7 @@
  *   "extractAll": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExtractLocalVariableOptions extends RefactoringOptions implements HasToJson {
   String _name;
@@ -15300,7 +15305,7 @@
  *   "lengths": List<int>
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExtractMethodFeedback extends RefactoringFeedback implements HasToJson {
   int _offset;
@@ -15564,7 +15569,7 @@
  *   "extractAll": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class ExtractMethodOptions extends RefactoringOptions implements HasToJson {
   String _returnType;
@@ -15765,7 +15770,7 @@
  *   "occurrences": int
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class InlineLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
   String _name;
@@ -15856,7 +15861,7 @@
 /**
  * inlineLocalVariable options
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class InlineLocalVariableOptions {
   @override
@@ -15882,7 +15887,7 @@
  *   "isDeclaration": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class InlineMethodFeedback extends RefactoringFeedback implements HasToJson {
   String _className;
@@ -16007,7 +16012,7 @@
  *   "inlineAll": bool
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class InlineMethodOptions extends RefactoringOptions implements HasToJson {
   bool _deleteSource;
@@ -16107,7 +16112,7 @@
 /**
  * moveFile feedback
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class MoveFileFeedback {
   @override
@@ -16131,7 +16136,7 @@
  *   "newFile": FilePath
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class MoveFileOptions extends RefactoringOptions implements HasToJson {
   String _newFile;
@@ -16210,7 +16215,7 @@
  *   "oldName": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RenameFeedback extends RefactoringFeedback implements HasToJson {
   int _offset;
@@ -16358,7 +16363,7 @@
  *   "newName": String
  * }
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RenameOptions extends RefactoringOptions implements HasToJson {
   String _newName;
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol.dart b/pkg/analysis_server/lib/plugin/protocol/protocol.dart
index 08e49f8..823ffd6 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol.dart
@@ -18,7 +18,7 @@
 /**
  * A [RequestHandler] that supports [startup] and [shutdown] methods.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class DomainHandler extends RequestHandler {
   /**
@@ -38,7 +38,7 @@
 /**
  * An interface for enumerated types in the protocol.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class Enum {
   /**
@@ -51,7 +51,7 @@
 /**
  * A notification from the server about an event that occurred.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Notification {
   /**
@@ -108,7 +108,7 @@
 /**
  * A request that was received from the client.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Request {
   /**
@@ -254,7 +254,7 @@
  * An exception that occurred during the handling of a request that requires
  * that an error be returned to the client.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class RequestFailure implements Exception {
   /**
@@ -271,7 +271,7 @@
 /**
  * An object that can handle requests and produce responses for them.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class RequestHandler {
   /**
@@ -286,7 +286,7 @@
 /**
  * A response to a request.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class Response {
   /**
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 3c6eea7..9222f4e 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -573,6 +573,9 @@
       if (node is LibraryIdentifier) {
         node = node.parent;
       }
+      if (node is StringLiteral && node.parent is UriBasedDirective) {
+        continue;
+      }
       Element element = ElementLocator.locate(node);
       if (node is SimpleIdentifier && element is PrefixElement) {
         element = getImportElement(node);
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 6e9af6d..b3dbca7 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -11,7 +11,6 @@
 
 import 'package:analysis_server/plugin/analysis/resolver_provider.dart';
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/server_options.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/plugin/options.dart';
@@ -21,6 +20,7 @@
 import 'package:analyzer/source/path_filter.dart';
 import 'package:analyzer/source/pub_package_map_provider.dart';
 import 'package:analyzer/source/sdk_ext.dart';
+import 'package:analyzer/src/context/context.dart' as context;
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
@@ -311,13 +311,6 @@
  */
 class ContextManagerImpl implements ContextManager {
   /**
-   * Temporary flag to hide WIP .packages support (DEP 5).
-   */
-  static bool ENABLE_PACKAGESPEC_SUPPORT = serverOptions.isSet(
-      'ContextManagerImpl.ENABLE_PACKAGESPEC_SUPPORT',
-      defaultValue: true);
-
-  /**
    * The name of the `lib` directory.
    */
   static const String LIB_DIR_NAME = 'lib';
@@ -466,31 +459,59 @@
   /**
    * Process [options] for the given context [info].
    */
-  void processOptionsForContext(
-      ContextInfo info, Map<String, YamlNode> options) {
-    if (options == null) {
+  void processOptionsForContext(ContextInfo info, Folder folder,
+      {bool optionsRemoved: false}) {
+    Map<String, YamlNode> options;
+    try {
+      options = analysisOptionsProvider.getOptions(folder);
+    } catch (e, stacktrace) {
+      AnalysisEngine.instance.logger.logError(
+          'Error processing .analysis_options',
+          new CaughtException(e, stacktrace));
+      // TODO(pquitslund): contribute plugin that sends error notification on
+      // options file.
+      // Related test:
+      //   context_manager_test.test_analysis_options_parse_failure()
+      // AnalysisEngine.instance.optionsPlugin.optionsProcessors
+      //      .forEach((OptionsProcessor p) => p.onError(e));
+    }
+
+    if (options == null && !optionsRemoved) {
       return;
     }
 
     // Notify options processors.
-    AnalysisEngine.instance.optionsPlugin.optionsProcessors.forEach(
-        (OptionsProcessor p) => p.optionsProcessed(info.context, options));
+    AnalysisEngine.instance.optionsPlugin.optionsProcessors
+        .forEach((OptionsProcessor p) {
+      try {
+        p.optionsProcessed(info.context, options);
+      } catch (e, stacktrace) {
+        AnalysisEngine.instance.logger.logError(
+            'Error processing .analysis_options',
+            new CaughtException(e, stacktrace));
+      }
+    });
+
+    // In case options files are removed, revert to default options.
+    if (optionsRemoved) {
+      info.context.analysisOptions = new AnalysisOptionsImpl();
+      return;
+    }
 
     // Analysis options are processed 'in-line'.
-    // TODO(pq): consider pushing exclude handling into a plugin.
     YamlMap analyzer = options['analyzer'];
     if (analyzer == null) {
       // No options for analyzer.
       return;
     }
 
-    // Set strong mode.
-    var strongMode = analyzer['strong-mode'];
-    if (strongMode == true) {
-      AnalysisContext context = info.context;
+    // Set strong mode (default is false).
+    bool strongMode = analyzer['strong-mode'] ?? false;
+    AnalysisContext context = info.context;
+    if (context.analysisOptions.strongMode != strongMode) {
       AnalysisOptionsImpl options =
           new AnalysisOptionsImpl.from(context.analysisOptions);
-      options.strongMode = true;
+      options.strongMode = strongMode;
       context.analysisOptions = options;
     }
 
@@ -707,6 +728,19 @@
     }
   }
 
+  void _checkForAnalysisOptionsUpdate(
+      String path, ContextInfo info, ChangeType changeType) {
+    if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) {
+      var analysisContext = info.context;
+      if (analysisContext is context.AnalysisContextImpl) {
+        processOptionsForContext(info, info.folder,
+            optionsRemoved: changeType == ChangeType.REMOVE);
+        analysisContext.invalidateCachedResults();
+        callbacks.applyChangesToContext(info.folder, new ChangeSet());
+      }
+    }
+  }
+
   void _checkForPackagespecUpdate(
       String path, ContextInfo info, Folder folder) {
     // Check to see if this is the .packages file for this context and if so,
@@ -793,12 +827,10 @@
       PackageMapInfo packageMapInfo;
       callbacks.beginComputePackageMap();
       try {
-        if (ENABLE_PACKAGESPEC_SUPPORT) {
-          // Try .packages first.
-          if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) {
-            Packages packages = _readPackagespec(packagespecFile);
-            return new PackagesFileDisposition(packages);
-          }
+        // Try .packages first.
+        if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) {
+          Packages packages = _readPackagespec(packagespecFile);
+          return new PackagesFileDisposition(packages);
         }
         if (packageResolverProvider != null) {
           UriResolver resolver = packageResolverProvider(folder);
@@ -844,21 +876,7 @@
     info.context = callbacks.addContext(folder, disposition);
     info.context.name = folder.path;
 
-    try {
-      Map<String, YamlNode> options =
-          analysisOptionsProvider.getOptions(folder);
-      processOptionsForContext(info, options);
-    } catch (e, stacktrace) {
-      AnalysisEngine.instance.logger.logError(
-          'Error processing .analysis_options',
-          new CaughtException(e, stacktrace));
-      // TODO(pquitslund): contribute plugin that sends error notification on
-      // options file.
-      // Related test:
-      //   context_manager_test.test_analysis_options_parse_failure()
-      // AnalysisEngine.instance.optionsPlugin.optionsProcessors
-      //      .forEach((OptionsProcessor p) => p.onError(e));
-    }
+    processOptionsForContext(info, folder);
 
     return info;
   }
@@ -877,7 +895,9 @@
    */
   void _createContexts(
       ContextInfo parent, Folder folder, bool withPackageSpecOnly) {
-    if (folder.shortName.startsWith('.') || folder.shortName == 'packages') {
+    if (_isExcluded(folder.path) ||
+        folder.shortName.startsWith('.') ||
+        folder.shortName == 'packages') {
       return;
     }
     // Decide whether a context needs to be created for [folder] here, and if
@@ -976,10 +996,8 @@
     // so, create it.
     File packageSpec;
 
-    if (ENABLE_PACKAGESPEC_SUPPORT) {
-      // Start by looking for .packages.
-      packageSpec = folder.getChild(PACKAGE_SPEC_NAME);
-    }
+    // Start by looking for .packages.
+    packageSpec = folder.getChild(PACKAGE_SPEC_NAME);
 
     // Fall back to looking for a pubspec.
     if (packageSpec == null || !packageSpec.exists) {
@@ -1053,41 +1071,31 @@
 
         Resource resource = resourceProvider.getResource(path);
 
-        if (ENABLE_PACKAGESPEC_SUPPORT) {
-          String directoryPath = pathContext.dirname(path);
+        String directoryPath = pathContext.dirname(path);
 
-          // Check to see if we need to create a new context.
-          if (info.isTopLevel) {
-            // Only create a new context if this is not the same directory
-            // described by our info object.
-            if (info.folder.path != directoryPath) {
-              if (_isPubspec(path)) {
-                // Check for a sibling .packages file.
-                if (!resourceProvider
-                    .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
-                    .exists) {
-                  _extractContext(info, resource);
-                  return;
-                }
-              }
-              if (_isPackagespec(path)) {
-                // Check for a sibling pubspec.yaml file.
-                if (!resourceProvider
-                    .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
-                    .exists) {
-                  _extractContext(info, resource);
-                  return;
-                }
+        // Check to see if we need to create a new context.
+        if (info.isTopLevel) {
+          // Only create a new context if this is not the same directory
+          // described by our info object.
+          if (info.folder.path != directoryPath) {
+            if (_isPubspec(path)) {
+              // Check for a sibling .packages file.
+              if (!resourceProvider
+                  .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
+                  .exists) {
+                _extractContext(info, resource);
+                return;
               }
             }
-          }
-        } else {
-          // pubspec was added in a sub-folder, extract a new context
-          if (_isPubspec(path) &&
-              info.isTopLevel &&
-              !info.isPathToPackageDescription(path)) {
-            _extractContext(info, resource);
-            return;
+            if (_isPackagespec(path)) {
+              // Check for a sibling pubspec.yaml file.
+              if (!resourceProvider
+                  .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
+                  .exists) {
+                _extractContext(info, resource);
+                return;
+              }
+            }
           }
         }
 
@@ -1111,34 +1119,27 @@
         // Note that it's important to verify that there is NEITHER a .packages nor a
         // lingering pubspec.yaml before merging.
         if (!info.isTopLevel) {
-          if (ENABLE_PACKAGESPEC_SUPPORT) {
-            String directoryPath = pathContext.dirname(path);
+          String directoryPath = pathContext.dirname(path);
 
-            // Only merge if this is the same directory described by our info object.
-            if (info.folder.path == directoryPath) {
-              if (_isPubspec(path)) {
-                // Check for a sibling .packages file.
-                if (!resourceProvider
-                    .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
-                    .exists) {
-                  _mergeContext(info);
-                  return;
-                }
-              }
-              if (_isPackagespec(path)) {
-                // Check for a sibling pubspec.yaml file.
-                if (!resourceProvider
-                    .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
-                    .exists) {
-                  _mergeContext(info);
-                  return;
-                }
+          // Only merge if this is the same directory described by our info object.
+          if (info.folder.path == directoryPath) {
+            if (_isPubspec(path)) {
+              // Check for a sibling .packages file.
+              if (!resourceProvider
+                  .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
+                  .exists) {
+                _mergeContext(info);
+                return;
               }
             }
-          } else {
-            if (info.isPathToPackageDescription(path)) {
-              _mergeContext(info);
-              return;
+            if (_isPackagespec(path)) {
+              // Check for a sibling pubspec.yaml file.
+              if (!resourceProvider
+                  .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
+                  .exists) {
+                _mergeContext(info);
+                return;
+              }
             }
           }
         }
@@ -1164,9 +1165,8 @@
         }
         break;
     }
-
-    //TODO(pquitslund): find the right place for this
     _checkForPackagespecUpdate(path, info, info.folder);
+    _checkForAnalysisOptionsUpdate(path, info, event.type);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/domain_experimental.dart b/pkg/analysis_server/lib/src/domain_experimental.dart
new file mode 100644
index 0000000..43631f2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_experimental.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2015, the Dart 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.
+
+library src.domain_experimental;
+
+import 'dart:core' hide Resource;
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+
+/**
+ * Instances of the class [ExperimentalDomainHandler] implement a
+ * [RequestHandler] that handles requests in the `experimental` domain.
+ */
+class ExperimentalDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * The name of the request used to get diagnostic information.
+   */
+  static const String EXPERIMENTAL_DIAGNOSTICS = 'experimental.diagnostics';
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  ExperimentalDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == EXPERIMENTAL_DIAGNOSTICS) {
+        return computeDiagnostics(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  /**
+   * Implement the `experimental.diagnostics` request.
+   */
+  Response computeDiagnostics(Request request) {
+    return new Response.unknownRequest(request);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
index a4971ce..dc4616f 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
@@ -31,13 +31,23 @@
         if (offset == null || length == null) {
           unit.accept(visitor);
         } else {
-          _DartRangeAstVisitor partVisitor =
-              new _DartRangeAstVisitor(offset, offset + length, visitor);
-          unit.accept(partVisitor);
+          AstNode node = _getNodeForRange(unit, offset, length);
+          node?.accept(visitor);
         }
       }
     }
   }
+
+  static AstNode _getNodeForRange(
+      CompilationUnit unit, int offset, int length) {
+    AstNode node = new NodeLocator(offset, offset + length).searchWithin(unit);
+    for (AstNode n = node; n != null; n = n.parent) {
+      if (n is Directive) {
+        return n;
+      }
+    }
+    return node;
+  }
 }
 
 /**
@@ -198,7 +208,9 @@
   @override
   visitIndexExpression(IndexExpression node) {
     super.visitIndexExpression(node);
-    computer._addRegionForToken(node.rightBracket, node.bestElement);
+    MethodElement element = node.bestElement;
+    computer._addRegionForToken(node.leftBracket, element);
+    computer._addRegionForToken(node.rightBracket, element);
   }
 
   @override
@@ -298,40 +310,3 @@
     }
   }
 }
-
-/**
- * An AST visitor that forwards nodes intersecting with the range from
- * [start] to [end] to the given [visitor].
- */
-class _DartRangeAstVisitor extends UnifyingAstVisitor {
-  final int start;
-  final int end;
-  final AstVisitor visitor;
-
-  _DartRangeAstVisitor(this.start, this.end, this.visitor);
-
-  bool isInRange(int offset) {
-    return start <= offset && offset <= end;
-  }
-
-  @override
-  visitNode(AstNode node) {
-    // The node ends before the range starts.
-    if (node.end < start) {
-      return;
-    }
-    // The node starts after the range ends.
-    if (node.offset > end) {
-      return;
-    }
-    // The node starts or ends in the range.
-    if (node is! CompilationUnit) {
-      if (isInRange(node.offset) || isInRange(node.end) || node is Directive) {
-        node.accept(visitor);
-        return;
-      }
-    }
-    // Go deeper.
-    super.visitNode(node);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/plugin/linter_plugin.dart b/pkg/analysis_server/lib/src/plugin/linter_plugin.dart
new file mode 100644
index 0000000..07fb54e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/plugin/linter_plugin.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2015, the Dart 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.
+
+library analysis_server.src.plugin.linter_plugin;
+
+import 'package:analysis_server/src/services/linter/linter.dart';
+import 'package:analyzer/plugin/options.dart';
+import 'package:plugin/plugin.dart';
+
+/// The shared linter server plugin instance.
+final LinterServerPlugin linterServerPlugin = new LinterServerPlugin();
+
+/// A plugin that defines the extension points and extensions that enhance
+/// linting in the server.
+class LinterServerPlugin implements Plugin {
+  /// The unique identifier of this plugin.
+  static const String UNIQUE_IDENTIFIER = 'linter.server';
+
+  @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    // None.
+  }
+
+  @override
+  void registerExtensions(RegisterExtension registerExtension) {
+    //
+    // Register options validators.
+    //
+    registerExtension(
+        OPTIONS_VALIDATOR_EXTENSION_POINT_ID, new LinterRuleOptionsValidator());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/plugin/server_plugin.dart b/pkg/analysis_server/lib/src/plugin/server_plugin.dart
index 5862b4a..c008c1c 100644
--- a/pkg/analysis_server/lib/src/plugin/server_plugin.dart
+++ b/pkg/analysis_server/lib/src/plugin/server_plugin.dart
@@ -21,6 +21,7 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/domain_execution.dart';
+import 'package:analysis_server/src/domain_experimental.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
@@ -270,7 +271,8 @@
     registerExtension(
         ANALYZE_FILE_EXTENSION_POINT_ID,
         (File file) => AnalysisEngine.isDartFileName(file.path) ||
-            AnalysisEngine.isHtmlFileName(file.path));
+            AnalysisEngine.isHtmlFileName(file.path) ||
+            AnalysisEngine.isAnalysisOptionsFileName(file.path));
     //
     // Register assist contributors.
     //
@@ -304,6 +306,8 @@
         (AnalysisServer server) => new CompletionDomainHandler(server));
     registerExtension(domainId,
         (AnalysisServer server) => new ExecutionDomainHandler(server));
+    registerExtension(domainId,
+        (AnalysisServer server) => new ExperimentalDomainHandler(server));
     //
     // Register fix contributors.
     //
@@ -314,6 +318,7 @@
     //
     registerExtension(
         INDEX_CONTRIBUTOR_EXTENSION_POINT_ID, new DartIndexContributor());
+
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index d9c101b..75f830b 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -14,7 +14,7 @@
  * contributors are long-lived objects and must not retain any state between
  * invocations of [computeSuggestions].
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class CompletionContributor {
   /**
@@ -27,7 +27,7 @@
 /**
  * The information about a requested list of completions.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class CompletionRequest {
   /**
@@ -55,7 +55,7 @@
 /**
  * The result of computing suggestions for code completion.
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class CompletionResult {
   /**
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_dart.dart
index 1ca4180..e52c433 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_dart.dart
@@ -16,9 +16,9 @@
  * file. Completion contributors are long-lived objects and must not retain any
  * state between invocations of [computeSuggestions].
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may extend this class when implementing plugins.
  */
-abstract class DartCompletionContributor extends CompletionContributor {
+abstract class DartCompletionContributor implements CompletionContributor {
   @override
   List<CompletionSuggestion> computeSuggestions(CompletionRequest request) {
     if (request is DartCompletionRequest) {
@@ -58,6 +58,8 @@
 
 /**
  * The information about a requested list of completions within a Dart file.
+ *
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class DartCompletionRequest extends CompletionRequest {
   /**
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart
index b24c610..e94016a 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart
@@ -81,6 +81,8 @@
  * there may be no edge in the parse tree which is appropriate to act as the
  * completion target; in this case, [entity] is set to null and
  * [containingNode] is set to the CompilationUnit.
+ *
+ * Clients may not extend, implement or mix-in this class.
  */
 class CompletionTarget {
   /**
@@ -103,6 +105,12 @@
   final Object entity;
 
   /**
+   * The [entity] is a comment token, which is either not a documentation
+   * comment or the position is not in a [CommentReference].
+   */
+  final bool isCommentText;
+
+  /**
    * If the target is an argument in an [ArgumentList], then this is the index
    * of the argument in the list, otherwise this is `null`.
    */
@@ -145,8 +153,13 @@
       for (var entity in containingNode.childEntities) {
         if (entity is Token) {
           if (_isCandidateToken(entity, offset)) {
+            // Try to replace with a comment token.
+            Token commentToken = _getContainingCommentToken(entity, offset);
+            if (commentToken != null) {
+              return new CompletionTarget._(containingNode, commentToken, true);
+            }
             // Target found.
-            return new CompletionTarget._(containingNode, entity);
+            return new CompletionTarget._(containingNode, entity, false);
           } else {
             // Since entity is a token, we don't need to look inside it; just
             // proceed to the next entity.
@@ -162,19 +175,24 @@
 
           // If the node is a candidate target, then we are done.
           if (_isCandidateNode(entity, offset)) {
-            // Check to see if the offset is in a preceeding comment
-            Token commentToken = _getContainingCommentToken(entity, offset);
+            // Check to see if the offset is in a preceding comment
+            Token commentToken =
+                _getContainingCommentToken(entity.beginToken, offset);
             if (commentToken != null) {
               entity = commentToken;
-              // If the preceeding comment is dartdoc token then update
-              // the containing node to be the dartdoc comment
+              // If the preceding comment is dartdoc token, then update
+              // the containing node to be the dartdoc comment.
+              // Otherwise completion is not required.
               Comment docComment =
                   _getContainingDocComment(containingNode, commentToken);
               if (docComment != null) {
                 containingNode = docComment;
+              } else {
+                return new CompletionTarget._(
+                    compilationUnit, commentToken, true);
               }
             }
-            return new CompletionTarget._(containingNode, entity);
+            return new CompletionTarget._(containingNode, entity, false);
           }
 
           // Otherwise, the completion target is somewhere inside the entity,
@@ -198,7 +216,7 @@
 
       // Since no completion target was found, we set the completion target
       // entity to null and use the compilationUnit as the parent.
-      return new CompletionTarget._(compilationUnit, null);
+      return new CompletionTarget._(compilationUnit, null, false);
     }
   }
 
@@ -206,7 +224,7 @@
    * Create a [CompletionTarget] holding the given [containingNode] and
    * [entity].
    */
-  CompletionTarget._(AstNode containingNode, Object entity)
+  CompletionTarget._(AstNode containingNode, Object entity, this.isCommentText)
       : this.containingNode = containingNode,
         this.entity = entity,
         this.argIndex = _computeArgIndex(containingNode, entity);
@@ -252,15 +270,14 @@
   }
 
   /**
-   * Determine if the offset is contained in a preceeding comment token
+   * Determine if the offset is contained in a preceding comment token
    * and return that token, otherwise return `null`.
    */
-  static Token _getContainingCommentToken(AstNode node, int offset) {
-    if (offset >= node.offset) {
+  static Token _getContainingCommentToken(Token token, int offset) {
+    if (token == null) {
       return null;
     }
-    Token token = node.beginToken;
-    if (token == null) {
+    if (offset >= token.offset) {
       return null;
     }
     token = token.precedingComments;
diff --git a/pkg/analysis_server/lib/src/provisional/refactoring/refactoring_core.dart b/pkg/analysis_server/lib/src/provisional/refactoring/refactoring_core.dart
index d27095c..086ce71 100644
--- a/pkg/analysis_server/lib/src/provisional/refactoring/refactoring_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/refactoring/refactoring_core.dart
@@ -65,7 +65,7 @@
 /**
  *
  *
- * Clients are expected to subtype this class when implementing plugins.
+ * Clients may implement this class when implementing plugins.
  */
 abstract class RefactoringContributor {
   /**
@@ -84,7 +84,7 @@
 /**
  *
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class RefactoringKind {
   factory RefactoringKind(String name, bool requiresOptions) {
@@ -95,7 +95,7 @@
 /**
  *
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class RefactoringStatus {
   // TODO(brianwilkerson) Fill this in.
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 804602a..c0650e0 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -6,12 +6,16 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/plugin/index/index_core.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/search/element_references.dart';
 import 'package:analysis_server/src/search/type_hierarchy.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/indexable_file.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 /**
@@ -25,9 +29,14 @@
   final AnalysisServer server;
 
   /**
+   * The [Index] for this server.
+   */
+  final Index index;
+
+  /**
    * The [SearchEngine] for this server.
    */
-  SearchEngine searchEngine;
+  final SearchEngine searchEngine;
 
   /**
    * The next search response id.
@@ -37,9 +46,10 @@
   /**
    * Initialize a newly created handler to handle requests for the given [server].
    */
-  SearchDomainHandler(this.server) {
-    searchEngine = server.searchEngine;
-  }
+  SearchDomainHandler(AnalysisServer server)
+      : server = server,
+        index = server.index,
+        searchEngine = server.searchEngine;
 
   Future findElementReferences(protocol.Request request) async {
     var params =
@@ -62,8 +72,37 @@
     }).where((Element element) {
       return element != null;
     }).toList();
-    // search
+    // prepare referenced file
+    String referencedFile = _getFileReferencedAt(params.file, params.offset);
+    // respond
     String searchId = (_nextSearchId++).toString();
+    var result = new protocol.SearchFindElementReferencesResult();
+    if (elements.isNotEmpty) {
+      result.id = searchId;
+      result.element = protocol.convertElement(elements.first);
+    } else if (referencedFile != null) {
+      result.id = searchId;
+      result.element =
+          new protocol.Element(protocol.ElementKind.FILE, referencedFile, 0);
+    }
+    _sendSearchResult(request, result);
+    // search for file
+    if (referencedFile != null) {
+      List<Location> locations = await index.getRelationships(
+          new IndexableFile(referencedFile), IndexConstants.IS_REFERENCED_BY);
+      List<protocol.SearchResult> results = <protocol.SearchResult>[];
+      for (Location location in locations) {
+        IndexableFile locationFile = location.indexable;
+        results.add(new protocol.SearchResult(
+            new protocol.Location(
+                locationFile.path, location.offset, location.length, -1, -1),
+            protocol.SearchResultKind.REFERENCE,
+            false,
+            []));
+      }
+      _sendSearchNotification(searchId, elements.isEmpty, results);
+    }
+    // search elements
     elements.forEach((Element element) async {
       var computer = new ElementReferencesComputer(searchEngine);
       List<protocol.SearchResult> results =
@@ -71,13 +110,6 @@
       bool isLast = identical(element, elements.last);
       _sendSearchNotification(searchId, isLast, results);
     });
-    // respond
-    var result = new protocol.SearchFindElementReferencesResult();
-    if (elements.isNotEmpty) {
-      result.id = searchId;
-      result.element = protocol.convertElement(elements[0]);
-    }
-    _sendSearchResult(request, result);
   }
 
   Future findMemberDeclarations(protocol.Request request) async {
@@ -189,6 +221,31 @@
     return null;
   }
 
+  /**
+   * Return the full path of the file referenced in the given [file] at the
+   * given [offset], maybe `null`.
+   */
+  String _getFileReferencedAt(String file, int offset) {
+    List<AstNode> nodes = server.getNodesAtOffset(file, offset);
+    if (nodes.length == 1) {
+      AstNode node = nodes.single;
+      if (node is SimpleIdentifier &&
+          node.parent is LibraryIdentifier &&
+          node.parent.parent is LibraryDirective) {
+        LibraryDirective libraryDirective = node.parent.parent;
+        return libraryDirective?.element?.source?.fullName;
+      }
+      if (node is StringLiteral && node.parent is UriBasedDirective) {
+        UriBasedDirective uriBasedDirective = node.parent;
+        return uriBasedDirective.source?.fullName;
+      }
+      if (node is UriBasedDirective) {
+        return node.source?.fullName;
+      }
+    }
+    return null;
+  }
+
   void _sendSearchNotification(
       String searchId, bool isLast, Iterable<protocol.SearchResult> results) {
     server.sendNotification(
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 1862b9f..698f63f 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -10,6 +10,7 @@
 
 import 'package:analysis_server/plugin/analysis/resolver_provider.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/plugin/linter_plugin.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/server/http_server.dart';
 import 'package:analysis_server/src/server/stdio_server.dart';
@@ -25,7 +26,6 @@
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:args/args.dart';
 import 'package:linter/src/plugin/linter_plugin.dart';
-import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
 
 /**
@@ -381,12 +381,14 @@
     //
     // Initialize the instrumentation service.
     //
-    if (instrumentationServer != null) {
-      String filePath = results[INSTRUMENTATION_LOG_FILE];
-      if (filePath != null) {
-        instrumentationServer = new MulticastInstrumentationServer(
-            [instrumentationServer, new FileInstrumentationServer(filePath)]);
-      }
+    String logFilePath = results[INSTRUMENTATION_LOG_FILE];
+    if (logFilePath != null) {
+      FileInstrumentationServer fileBasedServer =
+          new FileInstrumentationServer(logFilePath);
+      instrumentationServer = instrumentationServer != null
+          ? new MulticastInstrumentationServer(
+              [instrumentationServer, fileBasedServer])
+          : fileBasedServer;
     }
     InstrumentationService service =
         new InstrumentationService(instrumentationServer);
@@ -405,6 +407,7 @@
     plugins.add(serverPlugin);
     plugins.addAll(_userDefinedPlugins);
     plugins.add(linterPlugin);
+    plugins.add(linterServerPlugin);
 
     // Defer to the extension manager in AE for plugin registration.
     AnalysisEngine.instance.userDefinedPlugins = plugins;
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
index dac0056..b283ce9 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
@@ -30,6 +30,11 @@
 
   @override
   bool computeFast(DartCompletionRequest request) {
+    // Don't suggest in comments.
+    if (request.target.isCommentText) {
+      return true;
+    }
+
     OpType optype = request.optype;
     if (!optype.isPrefixed) {
       if (optype.includeReturnValueSuggestions ||
diff --git a/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
index c9d0c6f..0da2c8c 100644
--- a/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
@@ -22,7 +22,9 @@
 class KeywordContributor extends DartCompletionContributor {
   @override
   bool computeFast(DartCompletionRequest request) {
-    request.target.containingNode.accept(new _KeywordVisitor(request));
+    if (!request.target.isCommentText) {
+      request.target.containingNode.accept(new _KeywordVisitor(request));
+    }
     return true;
   }
 
@@ -33,7 +35,7 @@
 }
 
 /**
- * A vistor for generating keyword suggestions.
+ * A visitor for generating keyword suggestions.
  */
 class _KeywordVisitor extends GeneralizingAstVisitor {
   final DartCompletionRequest request;
@@ -176,18 +178,22 @@
 
   @override
   visitFormalParameterList(FormalParameterList node) {
-    AstNode constructorDecl =
+    AstNode constructorDeclaration =
         node.getAncestor((p) => p is ConstructorDeclaration);
-    if (constructorDecl != null) {
+    if (constructorDeclaration != null) {
       _addSuggestions([Keyword.THIS]);
     }
   }
 
   @override
   visitForStatement(ForStatement node) {
-    if (entity == node.rightSeparator && entity.toString() != ';') {
-      // Handle the degenerate case while typing - for (int x i^)
-      _addSuggestion(Keyword.IN, DART_RELEVANCE_HIGH);
+    // Handle the degenerate case while typing - for (int x i^)
+    if (node.condition == entity && entity is SimpleIdentifier) {
+      Token entityToken = (entity as SimpleIdentifier).beginToken;
+      if (entityToken.previous.isSynthetic &&
+          entityToken.previous.type == TokenType.SEMICOLON) {
+        _addSuggestion(Keyword.IN, DART_RELEVANCE_HIGH);
+      }
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
index e65fbc8..6753a40 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
@@ -24,6 +24,11 @@
 class LocalReferenceContributor extends DartCompletionContributor {
   @override
   bool computeFast(DartCompletionRequest request) {
+    // Don't suggest in comments.
+    if (request.target.isCommentText) {
+      return true;
+    }
+
     OpType optype = request.optype;
 
     // Collect suggestions from the specific child [AstNode] that contains
diff --git a/pkg/analysis_server/lib/src/services/completion/optype.dart b/pkg/analysis_server/lib/src/services/completion/optype.dart
index dc38919..3408e96 100644
--- a/pkg/analysis_server/lib/src/services/completion/optype.dart
+++ b/pkg/analysis_server/lib/src/services/completion/optype.dart
@@ -325,7 +325,36 @@
 
   @override
   void visitFormalParameterList(FormalParameterList node) {
-    optype.includeTypeNameSuggestions = true;
+    dynamic entity = this.entity;
+    if (entity is Token && entity.previous != null) {
+      TokenType type = entity.previous.type;
+      if (type == TokenType.OPEN_PAREN || type == TokenType.COMMA) {
+        optype.includeTypeNameSuggestions = true;
+      }
+    }
+    // Handle default normal parameter just as a normal parameter.
+    if (entity is DefaultFormalParameter) {
+      entity = entity.parameter;
+    }
+    // "(^ this.field)"
+    if (entity is FieldFormalParameter) {
+      if (offset < entity.thisKeyword.offset) {
+        optype.includeTypeNameSuggestions = true;
+      }
+    }
+    // "(Type name)"
+    if (entity is SimpleFormalParameter) {
+      // "(Type^)" is parsed as a parameter with the _name_ "Type".
+      if (entity.type == null) {
+        optype.includeTypeNameSuggestions = true;
+      }
+      // If inside of "Type" in "(Type^ name)", then include types.
+      if (entity.type != null &&
+          entity.type.offset <= offset &&
+          offset <= entity.type.end) {
+        optype.includeTypeNameSuggestions = true;
+      }
+    }
   }
 
   @override
@@ -460,8 +489,10 @@
 
   @override
   void visitNormalFormalParameter(NormalFormalParameter node) {
-    optype.includeReturnValueSuggestions = true;
-    optype.includeTypeNameSuggestions = true;
+    if (node.identifier != entity) {
+      optype.includeReturnValueSuggestions = true;
+      optype.includeTypeNameSuggestions = true;
+    }
   }
 
   void visitParenthesizedExpression(ParenthesizedExpression node) {
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index b8a5c20..5117855 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -13,8 +13,9 @@
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:path/path.dart' as path;
 
 const String DYNAMIC = 'dynamic';
@@ -140,7 +141,7 @@
 }
 
 /**
- * Starting with the given class node, traverse the inheritence hierarchy
+ * Starting with the given class node, traverse the inheritance hierarchy
  * calling the given functions with each non-null non-empty inherited class
  * declaration. For each locally defined declaration, call [localDeclaration].
  * For each class identifier in the hierarchy that is not defined locally,
@@ -436,12 +437,18 @@
       {bool isSuper: false, String containingMethodName: null}) {
     CompilationUnit compilationUnit =
         request.target.containingNode.getAncestor((n) => n is CompilationUnit);
-    LibraryElement library = compilationUnit.element.library;
+    CompilationUnitElement unitElem = compilationUnit.element;
+    if (unitElem == null) {
+      engine.AnalysisEngine.instance.logger
+          .logInformation('Completion expected resolved AST');
+      return;
+    }
+    LibraryElement library = unitElem.library;
     if (type is DynamicTypeImpl) {
       type = request.cache.objectClassElement.type;
     }
     if (type is InterfaceType) {
-      return new InterfaceTypeSuggestionBuilder(request)
+      new InterfaceTypeSuggestionBuilder(request)
           ._buildSuggestions(type, library, isSuper, containingMethodName);
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/uri_contributor.dart
index 6d19260..c6b20d3 100644
--- a/pkg/analysis_server/lib/src/services/completion/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/uri_contributor.dart
@@ -74,19 +74,17 @@
   visitSimpleStringLiteral(SimpleStringLiteral node) {
     AstNode parent = node.parent;
     if (parent is NamespaceDirective && parent.uri == node) {
-      String partial = node.literal.lexeme.substring(
-          node.contentsOffset - node.offset, request.offset - node.offset);
-      request.replacementOffset = node.contentsOffset;
-      request.replacementLength = node.contentsEnd - node.contentsOffset;
-      _addDartSuggestions();
-      _addPackageSuggestions(partial);
-      _addFileSuggestions(partial);
+      String partialUri = _extractPartialUri(node);
+      if (partialUri != null) {
+        _addDartSuggestions();
+        _addPackageSuggestions(partialUri);
+        _addFileSuggestions(partialUri);
+      }
     } else if (parent is PartDirective && parent.uri == node) {
-      String partial = node.literal.lexeme.substring(
-          node.contentsOffset - node.offset, request.offset - node.offset);
-      request.replacementOffset = node.contentsOffset;
-      request.replacementLength = node.contentsEnd - node.contentsOffset;
-      _addFileSuggestions(partial);
+      String partialUri = _extractPartialUri(node);
+      if (partialUri != null) {
+        _addFileSuggestions(partialUri);
+      }
     }
   }
 
@@ -190,4 +188,15 @@
         false,
         false));
   }
+
+  String _extractPartialUri(SimpleStringLiteral node) {
+    if (request.offset < node.contentsOffset) {
+      return null;
+    }
+    String partial = node.literal.lexeme.substring(
+        node.contentsOffset - node.offset, request.offset - node.offset);
+    request.replacementOffset = node.contentsOffset;
+    request.replacementLength = node.contentsEnd - node.contentsOffset;
+    return partial;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index e287c45..d83ca2f 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -331,30 +331,27 @@
 
   void _addProposal_assignToLocalVariable() {
     // prepare enclosing ExpressionStatement
-    Statement statement = node.getAncestor((node) => node is Statement);
-    if (statement is! ExpressionStatement) {
+    ExpressionStatement expressionStatement;
+    for (AstNode node = this.node; node != null; node = node.parent) {
+      if (node is ExpressionStatement) {
+        expressionStatement = node;
+        break;
+      }
+      if (node is ArgumentList ||
+          node is AssignmentExpression ||
+          node is Statement ||
+          node is ThrowExpression) {
+        _coverageMarker();
+        return;
+      }
+    }
+    if (expressionStatement == null) {
       _coverageMarker();
       return;
     }
-    ExpressionStatement expressionStatement = statement as ExpressionStatement;
     // prepare expression
     Expression expression = expressionStatement.expression;
     int offset = expression.offset;
-    // ignore if in arguments
-    if (node.getAncestor((node) => node is ArgumentList) != null) {
-      _coverageMarker();
-      return;
-    }
-    // ignore if already assignment
-    if (expression is AssignmentExpression) {
-      _coverageMarker();
-      return;
-    }
-    // ignore "throw"
-    if (expression is ThrowExpression) {
-      _coverageMarker();
-      return;
-    }
     // prepare expression type
     DartType type = expression.bestType;
     if (type.isVoid) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index b97fb61..a6f3099 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1339,6 +1339,7 @@
     }
     // may be there is an existing import,
     // but it is with prefix and we don't use this prefix
+    Set<Source> alreadyImportedWithPrefix = new Set<Source>();
     for (ImportElement imp in unitLibraryElement.imports) {
       // prepare element
       LibraryElement libraryElement = imp.importedLibrary;
@@ -1375,13 +1376,13 @@
         if (libraryElement.isInSdk) {
           libraryName = imp.uri;
         }
+        // don't add this library again
+        alreadyImportedWithPrefix.add(libraryElement.source);
         // update library
         String newShowCode = 'show ${StringUtils.join(showNames, ", ")}';
         _addReplaceEdit(
             rf.rangeOffsetEnd(showCombinator), newShowCode, unitLibraryElement);
         _addFix(DartFixKind.IMPORT_LIBRARY_SHOW, [libraryName]);
-        // we support only one import without prefix
-        return;
       }
     }
     // check SDK libraries
@@ -1422,6 +1423,10 @@
         if (librarySource.isInSystemLibrary) {
           continue;
         }
+        // maybe already imported with a prefix
+        if (alreadyImportedWithPrefix.contains(librarySource)) {
+          continue;
+        }
         // prepare LibraryElement
         LibraryElement libraryElement =
             context.getLibraryElement(librarySource);
diff --git a/pkg/analysis_server/lib/src/services/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart
index 645303a..5b2204c 100644
--- a/pkg/analysis_server/lib/src/services/index/index.dart
+++ b/pkg/analysis_server/lib/src/services/index/index.dart
@@ -10,7 +10,6 @@
 import 'package:analysis_server/src/services/index/indexable_element.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 /**
  * A filter for [Element] names.
@@ -79,7 +78,10 @@
   IndexableName(this.name);
 
   @override
-  IndexableObjectKind get kind => IndexableNameKind.INSTANCE;
+  String get filePath => null;
+
+  @override
+  IndexableNameKind get kind => IndexableNameKind.INSTANCE;
 
   @override
   int get offset {
@@ -87,9 +89,6 @@
   }
 
   @override
-  Source get source => null;
-
-  @override
   bool operator ==(Object object) =>
       object is IndexableName && object.name == name;
 
@@ -100,7 +99,7 @@
 /**
  * The kind of an indexable name.
  */
-class IndexableNameKind implements IndexableObjectKind {
+class IndexableNameKind implements IndexableObjectKind<IndexableName> {
   /**
    * The unique instance of this class.
    */
@@ -120,14 +119,14 @@
   }
 
   @override
-  IndexableObject decode(AnalysisContext context, String filePath, int offset) {
+  IndexableName decode(AnalysisContext context, String filePath, int offset) {
     throw new UnsupportedError(
         'Indexable names cannot be decoded through their kind');
   }
 
   @override
-  int encodeHash(StringToInt stringToInt, IndexableObject indexable) {
-    String name = (indexable as IndexableName).name;
+  int encodeHash(StringToInt stringToInt, IndexableName indexable) {
+    String name = indexable.name;
     return stringToInt(name);
   }
 }
@@ -338,7 +337,7 @@
   static int _NEXT_HASH_CODE = 0;
 
   /**
-   * The artifitial hash code for this object.
+   * The artificial hash code for this object.
    */
   final int _hashCode = _NEXT_HASH_CODE++;
 
diff --git a/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
index 34aec15..6fcd934 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/index_store.dart';
 import 'package:analysis_server/src/services/index/indexable_element.dart';
+import 'package:analysis_server/src/services/index/indexable_file.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -37,6 +38,7 @@
 class _IndexContributor extends GeneralizingAstVisitor {
   final InternalIndexStore _store;
 
+  CompilationUnitElement _unitElement;
   LibraryElement _libraryElement;
 
   Map<ImportElement, Set<Element>> _importElementsMap = {};
@@ -186,10 +188,10 @@
 
   @override
   visitCompilationUnit(CompilationUnit node) {
-    CompilationUnitElement unitElement = node.element;
-    if (unitElement != null) {
-      _elementStack.add(unitElement);
-      _libraryElement = unitElement.enclosingElement;
+    _unitElement = node.element;
+    if (_unitElement != null) {
+      _elementStack.add(_unitElement);
+      _libraryElement = _unitElement.enclosingElement;
       if (_libraryElement != null) {
         super.visitCompilationUnit(node);
       }
@@ -279,6 +281,7 @@
       LibraryElement expLibrary = element.exportedLibrary;
       _recordLibraryReference(node, expLibrary);
     }
+    _recordUriFileReference(node);
     super.visitExportDirective(node);
   }
 
@@ -319,6 +322,7 @@
       LibraryElement impLibrary = element.importedLibrary;
       _recordLibraryReference(node, impLibrary);
     }
+    _recordUriFileReference(node);
     super.visitImportDirective(node);
   }
 
@@ -375,6 +379,7 @@
     LocationImpl location = _createLocationForNode(node.uri);
     recordRelationshipElement(
         element, IndexConstants.IS_REFERENCED_BY, location);
+    _recordUriFileReference(node);
     super.visitPartDirective(node);
   }
 
@@ -790,6 +795,18 @@
     }
   }
 
+  void _recordUriFileReference(UriBasedDirective directive) {
+    Source source = directive.source;
+    if (source != null) {
+      LocationImpl location = new LocationImpl(
+          new IndexableFile(_unitElement.source.fullName),
+          directive.uri.offset,
+          directive.uri.length);
+      _store.recordRelationship(new IndexableFile(source.fullName),
+          IndexConstants.IS_REFERENCED_BY, location);
+    }
+  }
+
   /**
    * If the given expression has resolved type, returns the new location with this type.
    *
diff --git a/pkg/analysis_server/lib/src/services/index/indexable_element.dart b/pkg/analysis_server/lib/src/services/index/indexable_element.dart
index 594645b..57f8659 100644
--- a/pkg/analysis_server/lib/src/services/index/indexable_element.dart
+++ b/pkg/analysis_server/lib/src/services/index/indexable_element.dart
@@ -31,10 +31,15 @@
   }
 
   @override
+  String get filePath {
+    return element.source?.fullName;
+  }
+
+  @override
   int get hashCode => element.hashCode;
 
   @override
-  IndexableObjectKind get kind => IndexableElementKind.forElement(element);
+  IndexableElementKind get kind => IndexableElementKind.forElement(element);
 
   @override
   int get offset {
@@ -45,9 +50,6 @@
   }
 
   @override
-  Source get source => element.source;
-
-  @override
   bool operator ==(Object object) =>
       object is IndexableElement && element == object.element;
 
@@ -58,7 +60,7 @@
 /**
  * The kind associated with an [IndexableElement].
  */
-class IndexableElementKind implements IndexableObjectKind {
+class IndexableElementKind implements IndexableObjectKind<IndexableElement> {
   /**
    * A table mapping element kinds to the corresponding indexable element kind.
    */
@@ -102,7 +104,8 @@
   }
 
   @override
-  IndexableObject decode(AnalysisContext context, String filePath, int offset) {
+  IndexableElement decode(
+      AnalysisContext context, String filePath, int offset) {
     List<Source> unitSources = context.getSourcesWithFullName(filePath);
     for (Source unitSource in unitSources) {
       List<Source> libSources = context.getLibrariesContaining(unitSource);
@@ -141,17 +144,15 @@
   }
 
   @override
-  int encodeHash(StringToInt stringToInt, IndexableObject indexable) {
-    Element element = (indexable as IndexableElement).element;
+  int encodeHash(StringToInt stringToInt, IndexableElement indexable) {
+    Element element = indexable.element;
     String elementName = element.displayName;
     int elementNameId = stringToInt(elementName);
-    if (indexable is IndexableElement) {
-      LibraryElement libraryElement = indexable.element.library;
-      if (libraryElement != null) {
-        String libraryPath = libraryElement.source.fullName;
-        int libraryPathId = stringToInt(libraryPath);
-        return JenkinsSmiHash.combine(libraryPathId, elementNameId);
-      }
+    LibraryElement libraryElement = element.library;
+    if (libraryElement != null) {
+      String libraryPath = libraryElement.source.fullName;
+      int libraryPathId = stringToInt(libraryPath);
+      return JenkinsSmiHash.combine(libraryPathId, elementNameId);
     }
     return elementNameId;
   }
diff --git a/pkg/analysis_server/lib/src/services/index/indexable_file.dart b/pkg/analysis_server/lib/src/services/index/indexable_file.dart
new file mode 100644
index 0000000..7babfef
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/index/indexable_file.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2015, the Dart 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.
+
+library services.index.indexable_file;
+
+import 'package:analysis_server/plugin/index/index_core.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+/**
+ * An [IndexableObject] which is used to index references to a file.
+ */
+class IndexableFile implements IndexableObject {
+  /**
+   * The path of the file to be indexed.
+   */
+  @override
+  final String path;
+
+  /**
+   * Initialize a newly created indexable file to represent the given [path].
+   */
+  IndexableFile(this.path);
+
+  @override
+  String get filePath => path;
+
+  @override
+  IndexableObjectKind get kind => IndexableFileKind.INSTANCE;
+
+  @override
+  int get offset => -1;
+
+  @override
+  bool operator ==(Object object) =>
+      object is IndexableFile && object.path == path;
+
+  @override
+  String toString() => path;
+}
+
+/**
+ * The kind of an indexable file.
+ */
+class IndexableFileKind implements IndexableObjectKind<IndexableFile> {
+  /**
+   * The unique instance of this class.
+   */
+  static final IndexableFileKind INSTANCE =
+      new IndexableFileKind._(IndexableObjectKind.nextIndex);
+
+  /**
+   * The index uniquely identifying this kind.
+   */
+  final int index;
+
+  /**
+   * Initialize a newly created kind to have the given [index].
+   */
+  IndexableFileKind._(this.index) {
+    IndexableObjectKind.register(this);
+  }
+
+  @override
+  IndexableFile decode(AnalysisContext context, String filePath, int offset) {
+    return new IndexableFile(filePath);
+  }
+
+  @override
+  int encodeHash(StringToInt stringToInt, IndexableFile indexable) {
+    String path = indexable.path;
+    return stringToInt(path);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/index/store/codec.dart b/pkg/analysis_server/lib/src/services/index/store/codec.dart
index 86e0723..8fd23ab 100644
--- a/pkg/analysis_server/lib/src/services/index/store/codec.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/codec.dart
@@ -9,7 +9,6 @@
 import 'package:analysis_server/plugin/index/index_core.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 /**
  * A helper that encodes/decodes [AnalysisContext]s from/to integers.
@@ -93,11 +92,10 @@
    * If the given [indexable] is not defined in a file, returns `-1`.
    */
   int encode1(IndexableObject indexable) {
-    Source source = indexable.source;
-    if (source == null) {
+    String filePath = indexable.filePath;
+    if (filePath == null) {
       return -1;
     }
-    String filePath = source.fullName;
     return _stringCodec.encode(filePath);
   }
 
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index eed774f..880cad3 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -813,7 +813,7 @@
 
   @override
   bool aboutToIndex(AnalysisContext context, Object object) {
-    if (context.isDisposed) {
+    if (context == null || context.isDisposed) {
       return false;
     }
     // try to find a node name
diff --git a/pkg/analysis_server/lib/src/services/linter/linter.dart b/pkg/analysis_server/lib/src/services/linter/linter.dart
new file mode 100644
index 0000000..87692ea
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/linter/linter.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2014, the Dart 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.
+
+library services.src.linter;
+
+import 'package:analyzer/plugin/options.dart';
+import 'package:analyzer/analyzer.dart';
+import 'package:yaml/yaml.dart';
+import 'package:linter/src/rules.dart';
+import 'package:linter/src/linter.dart';
+
+/**
+ * An error code indicating an undefined lint rule.
+ *
+ * Parameters:
+ * 0: the rule name
+ */
+const AnalysisOptionsWarningCode UNDEFINED_LINT_WARNING =
+    const AnalysisOptionsWarningCode(
+        'UNDEFINED_LINT_WARNING', "Undefined lint rule '{0}'");
+
+/// Validates `linter` rule configurations.
+class LinterRuleOptionsValidator extends OptionsValidator {
+  static const linter = 'linter';
+  static const rulesKey = 'rules';
+  @override
+  List<AnalysisError> validate(
+      ErrorReporter reporter, Map<String, YamlNode> options) {
+    List<AnalysisError> errors = <AnalysisError>[];
+    var node = options[linter];
+    if (node is YamlMap) {
+      var rules = node.nodes[rulesKey];
+      validateRules(rules, reporter);
+    }
+    return errors;
+  }
+
+  validateRules(dynamic rules, ErrorReporter reporter) {
+    if (rules is YamlList) {
+      //TODO(pq): migrate this to a proper API once there is one.
+      Iterable<String> registeredLints = ruleRegistry.map((r) => r.name);
+      rules.nodes.forEach((YamlNode ruleNode) {
+        if (!registeredLints.contains(ruleNode.value)) {
+          reporter.reportErrorForSpan(
+              UNDEFINED_LINT_WARNING, ruleNode.span, [ruleNode.value]);
+        }
+      });
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
index 3822636..05d651b 100644
--- a/pkg/analysis_server/lib/src/status/get_handler.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart
@@ -25,6 +25,7 @@
 import 'package:analysis_server/src/status/element_writer.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart'
@@ -35,7 +36,9 @@
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/html.dart';
@@ -302,10 +305,8 @@
         results.add(EXPLICITLY_IMPORTED_LIBRARIES);
         results.add(EXPORT_SOURCE_CLOSURE);
         results.add(EXPORTED_LIBRARIES);
-        results.add(IMPORT_EXPORT_SOURCE_CLOSURE);
         results.add(IMPORTED_LIBRARIES);
         results.add(INCLUDED_PARTS);
-        results.add(IS_CLIENT);
         results.add(IS_LAUNCHABLE);
         results.add(LIBRARY_ELEMENT1);
         results.add(LIBRARY_ELEMENT2);
@@ -327,6 +328,8 @@
         results.add(HTML_DOCUMENT_ERRORS);
         results.add(HTML_ERRORS);
         results.add(REFERENCED_LIBRARIES);
+      } else if (AnalysisEngine.isAnalysisOptionsFileName(name)) {
+        results.add(ANALYSIS_OPTIONS_ERRORS);
       }
     } else if (target is LibrarySpecificUnit) {
       results.add(COMPILATION_UNIT_CONSTANTS);
@@ -553,6 +556,51 @@
               classes: [null, "right", "right", "right"]);
           buffer.write('</table>');
         });
+        //
+        // Write task model inputs timing information.
+        //
+        {
+          buffer.write('<p><b>Task inputs performace data</b></p>');
+          buffer.write(
+              '<table style="border-collapse: separate; border-spacing: 10px 5px;">');
+          _writeRow(
+              buffer,
+              [
+                'Task Name',
+                'Count',
+                'Total Time (in ms)',
+                'Average Time (in ms)'
+              ],
+              header: true);
+
+          Map<TaskDescriptor, int> countMap = WorkItem.countMap;
+          Map<TaskDescriptor, Stopwatch> stopwatchMap = WorkItem.stopwatchMap;
+          List<TaskDescriptor> taskClasses = stopwatchMap.keys.toList();
+          taskClasses.sort((TaskDescriptor first, TaskDescriptor second) {
+            String firstName = first.name;
+            String secondName = second.name;
+            return firstName.compareTo(secondName);
+          });
+          taskClasses.forEach((TaskDescriptor descriptor) {
+            int count = countMap[descriptor];
+            if (count == null) {
+              count = 0;
+            }
+            int taskTime = stopwatchMap[descriptor].elapsedMilliseconds;
+            _writeRow(buffer, [
+              descriptor.name,
+              count,
+              taskTime,
+              count <= 0 ? '-' : (taskTime / count).toStringAsFixed(3)
+            ], classes: [
+              null,
+              "right",
+              "right",
+              "right"
+            ]);
+          });
+          buffer.write('</table>');
+        }
       });
     });
   }
@@ -981,6 +1029,9 @@
     explicitNames.sort();
     implicitNames.sort();
 
+    AnalysisDriver driver = (context as AnalysisContextImpl).driver;
+    List<WorkItem> workItems = driver.currentWorkOrder?.workItems;
+
     _overlayContents.clear();
     context.visitContentCache((String fullName, int stamp, String contents) {
       _overlayContents[fullName] = contents;
@@ -1011,6 +1062,27 @@
       _writePage(
           buffer, 'Analysis Server - Context', ['Context: $contextFilter'],
           (StringBuffer buffer) {
+        buffer.write('<h3>Most Recently Perfomed Tasks</h3>');
+        AnalysisTask.LAST_TASKS.forEach((String description) {
+          buffer.write('<p>$description</p>');
+        });
+
+        String _describe(WorkItem item) {
+          if (item == null) {
+            return 'None';
+          }
+          return '${item.descriptor?.name} computing ${item.spawningResult?.name} for ${item.target?.toString()}';
+        }
+
+        buffer.write('<h3>Work Items</h3>');
+        buffer.write(
+            '<p><b>Current:</b> ${_describe(driver.currentWorkOrder?.current)}</p>');
+        if (workItems != null) {
+          buffer.writeAll(workItems.reversed
+              .map((item) => '<p>${_describe(item)}</p>')
+              ?.toList());
+        }
+
         _writeFiles(buffer, 'Priority Files', priorityNames);
         _writeFiles(buffer, 'Explicitly Analyzed Files', explicitNames);
         _writeFiles(buffer, 'Implicitly Analyzed Files', implicitNames);
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index a403a94..ad5b19d 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -2,7 +2,7 @@
 // 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.
 
-library driver;
+library analysis_server.starter;
 
 import 'package:analysis_server/plugin/analysis/resolver_provider.dart';
 import 'package:analysis_server/src/server/driver.dart';
@@ -10,9 +10,10 @@
 import 'package:plugin/plugin.dart';
 
 /**
- * An object that can be used to start an analysis server.
+ * An object that can be used to start an analysis server. This class exists so
+ * that clients can configure an analysis server before starting it.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class ServerStarter {
   /**
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 2500327..3f53b5b 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -4,9 +4,9 @@
 description: A server that performs analysis of Dart code over character streams using JSON-RPC encoded information.
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.9.0 <2.0.0'
+  sdk: '>=1.12.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.26.1+9 <0.27.0'
+  analyzer: '>=0.26.1+16 <0.27.0'
   args: '>=0.13.0 <0.14.0'
   dart_style: '>=0.2.0 <0.3.0'
   linter: ^0.1.3+2
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index fb49169..add8b90 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -58,7 +58,7 @@
     return _checkInvalid(file, -1, -1);
   }
 
-  test_issue24599_importDirective() async {
+  test_importDirective() async {
     addTestFile('''
 import 'dart:math';
 
@@ -72,7 +72,7 @@
     expect(testTargets[0].kind, ElementKind.LIBRARY);
   }
 
-  test_issue24599_importKeyword() async {
+  test_importKeyword() async {
     addTestFile('''
 import 'dart:math';
 
@@ -86,7 +86,7 @@
     expect(testTargets[0].kind, ElementKind.LIBRARY);
   }
 
-  test_issue24599_importUri() async {
+  test_importUri() async {
     addTestFile('''
 import 'dart:math';
 
@@ -130,6 +130,52 @@
     assertNoRegionAt('ddd)');
   }
 
+  test_operator_index() async {
+    addTestFile('''
+class A {
+  A operator [](index) => null;
+  operator []=(index, A value) {}
+}
+main() {
+  var a = new A();
+  a[0] // [];
+  a[1] = 1; // []=;
+  a[2] += 2;
+}
+''');
+    await waitForTasksFinished();
+    {
+      String search = '[0';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[](index)', 2);
+    }
+    {
+      String search = '] // []';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[](index)', 2);
+    }
+    {
+      String search = '[1';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[]=(index', 3);
+    }
+    {
+      String search = '] = 1';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[]=(index', 3);
+    }
+    {
+      String search = '[2';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[]=(index', 3);
+    }
+    {
+      String search = '] += 2';
+      await _getNavigation(testFile, testCode.indexOf(search), 1);
+      assertHasOperatorRegion(search, 1, '[]=(index', 3);
+    }
+  }
+
   test_removeContextAfterRequest() async {
     addTestFile('''
 main() {
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
new file mode 100644
index 0000000..1d4c9d1
--- /dev/null
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -0,0 +1,233 @@
+// Copyright (c) 2015, the Dart 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.
+
+library test.analysis.notification.analysis_options;
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/services/lint.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../analysis_abstract.dart';
+import '../mocks.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(AnalysisOptionsFileNotificationTest);
+}
+
+@reflectiveTest
+class AnalysisOptionsFileNotificationTest extends AbstractAnalysisTest {
+  /// Cached model state in case tests need to set task model to on/off.
+  bool wasTaskModelEnabled;
+
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  final testSource = '''
+main() {
+  var x = '';
+  int y = x; // Not assignable in strong-mode
+  print(y);
+}''';
+
+  List<AnalysisError> get errors => filesErrors[testFile];
+
+  List<AnalysisError> get optionsFileErrors => filesErrors[optionsFilePath];
+
+  String get optionsFilePath => '$projectPath/.analysis_options';
+
+  AnalysisContext get testContext => server.getContainingContext(testFile);
+
+  void addOptionsFile(String contents) {
+    addFile(optionsFilePath, contents);
+  }
+
+  void deleteFile(String filePath) {
+    resourceProvider.deleteFile(filePath);
+  }
+
+  @override
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_ERRORS) {
+      var decoded = new AnalysisErrorsParams.fromNotification(notification);
+      filesErrors[decoded.file] = decoded.errors;
+    }
+  }
+
+  void setAnalysisRoot() {
+    Request request =
+        new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0');
+    handleSuccessfulRequest(request);
+  }
+
+  void setStrongMode(bool isSet) {
+    addOptionsFile('''
+analyzer:
+  strong-mode: $isSet
+''');
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    server.handlers = [new AnalysisDomainHandler(server)];
+    wasTaskModelEnabled = AnalysisEngine.instance.useTaskModel;
+    AnalysisEngine.instance.useTaskModel = true;
+  }
+
+  @override
+  void tearDown() {
+    AnalysisEngine.instance.useTaskModel = wasTaskModelEnabled;
+    super.tearDown();
+  }
+
+  test_lint_options_changes() async {
+    addOptionsFile('''
+linter:
+  rules:
+    - camel_case_types
+    - constant_identifier_names
+''');
+
+    addTestFile(testSource);
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    verifyLintsEnabled(['camel_case_types', 'constant_identifier_names']);
+
+    addOptionsFile('''
+linter:
+  rules:
+    - camel_case_types
+''');
+
+    await pumpEventQueue();
+    await waitForTasksFinished();
+
+    verifyLintsEnabled(['camel_case_types']);
+  }
+
+  test_lint_options_unsupported() async {
+    addOptionsFile('''
+linter:
+  rules:
+    - unsupported
+''');
+
+    addTestFile(testSource);
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    expect(optionsFileErrors, hasLength(1));
+    expect(optionsFileErrors.first.severity, AnalysisErrorSeverity.WARNING);
+    expect(optionsFileErrors.first.type, AnalysisErrorType.STATIC_WARNING);
+  }
+
+  test_options_file_added() async {
+    addTestFile(testSource);
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    // Verify strong-mode disabled.
+    verifyStrongMode(enabled: false);
+
+    // Clear errors.
+    filesErrors[testFile] = [];
+
+    // Add options file with strong mode enabled.
+    setStrongMode(true);
+
+    await pumpEventQueue();
+    await waitForTasksFinished();
+
+    verifyStrongMode(enabled: true);
+  }
+
+  test_options_file_parse_error() async {
+    addOptionsFile('''
+; #bang
+''');
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    expect(optionsFileErrors, hasLength(1));
+    expect(optionsFileErrors.first.severity, AnalysisErrorSeverity.ERROR);
+    expect(optionsFileErrors.first.type, AnalysisErrorType.COMPILE_TIME_ERROR);
+  }
+
+  test_options_file_removed() async {
+    setStrongMode(true);
+
+    addTestFile(testSource);
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    verifyStrongMode(enabled: true);
+
+    // Clear errors.
+    filesErrors[testFile] = [];
+
+    deleteFile(optionsFilePath);
+
+    await pumpEventQueue();
+    await waitForTasksFinished();
+
+    verifyStrongMode(enabled: false);
+  }
+
+  test_strong_mode_changed() async {
+    setStrongMode(true);
+
+    addTestFile(testSource);
+    setAnalysisRoot();
+
+    await waitForTasksFinished();
+
+    verifyStrongMode(enabled: true);
+
+    // Clear errors.
+    filesErrors[testFile] = [];
+
+    setStrongMode(false);
+
+    await pumpEventQueue();
+    await waitForTasksFinished();
+
+    verifyStrongMode(enabled: false);
+  }
+
+  void verifyLintsEnabled(List<String> lints) {
+    expect(testContext.analysisOptions.lint, true);
+    var rules = getLints(testContext).map((rule) => rule.name);
+    expect(rules, unorderedEquals(lints));
+  }
+
+  verifyStrongMode({bool enabled}) {
+    // Verify strong-mode enabled.
+    expect(testContext.analysisOptions.strongMode, enabled);
+
+    if (enabled) {
+      // Should produce a warning and an error.
+      expect(
+          errors.map((error) => error.type),
+          unorderedEquals([
+            AnalysisErrorType.STATIC_TYPE_WARNING,
+            AnalysisErrorType.COMPILE_TIME_ERROR
+          ]));
+    } else {
+      // Should only produce a hint.
+      expect(errors.map((error) => error.type),
+          unorderedEquals([AnalysisErrorType.HINT]));
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 7cc7099..46de68d 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -87,10 +87,8 @@
     handleSuccessfulRequest(request);
 
     return waitForTasksFinished().then((_) {
-      // Confirm lint is registered.
-      expect(lintRegistry, isNotEmpty);
       AnalysisContext testContext = server.getContainingContext(testFile);
-      List<Linter> lints = lintRegistry[testContext];
+      List<Linter> lints = getLints(testContext);
       // Registry should only contain single lint rule.
       expect(lints, hasLength(1));
       LintRule lint = lints.first as LintRule;
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 5e66eca..68b347c 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -777,8 +777,11 @@
 }
 ''');
     return prepareNavigation().then((_) {
+      assertHasOperatorRegion('[0', 1, '[](index)', 2);
       assertHasOperatorRegion('] // []', 1, '[](index)', 2);
+      assertHasOperatorRegion('[1', 1, '[]=(index,', 3);
       assertHasOperatorRegion('] = 1;', 1, '[]=(index,', 3);
+      assertHasOperatorRegion('[2', 1, '[]=(index,', 3);
       assertHasOperatorRegion('] += 2;', 1, '[]=(index,', 3);
       assertHasOperatorRegion('+= 2;', 2, '+(other)', 1);
     });
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 468d420..05b49f3d 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -9,6 +9,7 @@
 import 'get_errors_test.dart' as get_errors_test;
 import 'get_hover_test.dart' as get_hover_test;
 import 'get_navigation_test.dart' as get_navigation_test;
+import 'notification_analysis_options_test.dart' as notification_analysis_options_test;
 import 'notification_analyzedFiles_test.dart'
     as notification_analyzedFiles_test;
 import 'notification_errors_test.dart' as notification_errors_test;
@@ -31,6 +32,7 @@
     get_errors_test.main();
     get_hover_test.main();
     get_navigation_test.main();
+    notification_analysis_options_test.main();
     notification_analyzedFiles_test.main();
     notification_errors_test.main();
     notification_highlights_test.main();
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index 656e06a..6fbc5d8 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -107,7 +107,11 @@
     server.updateContent('2', {testFile: new RemoveContentOverlay()});
     // Validate that at the end the unit was indexed.
     await server.onAnalysisComplete;
-    verify(server.index.index(anyObject, testUnitMatcher)).times(2);
+    if (AnalysisEngine.instance.useTaskModel) {
+      verify(server.index.index(anyObject, testUnitMatcher)).times(3);
+    } else {
+      verify(server.index.index(anyObject, testUnitMatcher)).times(2);
+    }
   }
 
   test_multiple_contexts() async {
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 91a2ed9..c367665 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/plugin/linter_plugin.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -54,7 +55,7 @@
   final Map<AnalysisService, List<String>> analysisSubscriptions = {};
 
   String projectPath = '/project';
-  String testFolder = '/project/bin/';
+  String testFolder = '/project/bin';
   String testFile = '/project/bin/test.dart';
   String testCode;
 
@@ -97,7 +98,11 @@
   AnalysisServer createAnalysisServer(Index index) {
     ServerPlugin serverPlugin = new ServerPlugin();
     // TODO(pq): this convoluted extension registry dance needs cleanup.
-    List<Plugin> plugins = <Plugin>[serverPlugin, linterPlugin];
+    List<Plugin> plugins = <Plugin>[
+      serverPlugin,
+      linterPlugin,
+      linterServerPlugin
+    ];
     // Accessing `taskManager` ensures that AE plugins are registered.
     AnalysisEngine.instance.taskManager;
     plugins.addAll(AnalysisEngine.instance.supportedPlugins);
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 9f75123..d964390 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -221,7 +221,7 @@
     File bar = resourceProvider.newFile('/bar/bar.dart', 'library lib;');
     Source barSource = bar.createSource();
     server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
-    return pumpEventQueue(200).then((_) {
+    return pumpEventQueue(500).then((_) {
       expect(server.statusAnalyzing, isFalse);
       // Make sure getAnalysisContext returns the proper context for each.
       AnalysisContext fooContext =
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 0a43e34..26f85a2 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:package_config/packages.dart';
 import 'package:path/path.dart';
-import 'package:plugin/manager.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
@@ -90,15 +89,6 @@
     callbacks = new TestContextManagerCallbacks(resourceProvider);
     manager.callbacks = callbacks;
     resourceProvider.newFolder(projPath);
-    ContextManagerImpl.ENABLE_PACKAGESPEC_SUPPORT = true;
-
-    // Options processing is required in context creation.
-    ExtensionManager em = new ExtensionManager();
-    em.processPlugins([AnalysisEngine.instance.optionsPlugin]);
-  }
-
-  void tearDown() {
-    ContextManagerImpl.ENABLE_PACKAGESPEC_SUPPORT = false;
   }
 
   test_analysis_options_parse_failure() async {
@@ -942,6 +932,19 @@
     _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
   }
 
+  void test_setRoots_noContext_excludedFolder() {
+    // prepare paths
+    String project = '/project';
+    String excludedFolder = '$project/excluded';
+    String excludedPubspec = '$excludedFolder/pubspec.yaml';
+    // create files
+    resourceProvider.newFile(excludedPubspec, 'name: ignore-me');
+    // set "/project", and exclude "/project/excluded"
+    manager.setRoots(
+        <String>[project], <String>[excludedFolder], <String, String>{});
+    callbacks.assertContextPaths([project]);
+  }
+
   void test_setRoots_noContext_inDotFolder() {
     String pubspecPath = posix.join(projPath, '.pub', 'pubspec.yaml');
     resourceProvider.newFile(pubspecPath, 'name: test');
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index b296508..f0d6f83 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -54,6 +54,9 @@
   int requestCount = 0;
   String testFile2 = '/project/bin/test2.dart';
 
+  /// Cached model state in case tests need to set task model to on/off.
+  bool wasTaskModelEnabled;
+
   AnalysisServer createAnalysisServer(Index index) {
     ExtensionManager manager = new ExtensionManager();
     ServerPlugin serverPlugin = new ServerPlugin();
@@ -84,6 +87,8 @@
   @override
   void setUp() {
     super.setUp();
+    wasTaskModelEnabled = AnalysisEngine.instance.useTaskModel;
+    AnalysisEngine.instance.useTaskModel = true;
     createProject();
     analysisDomain = handler;
     completionDomain = new Test_CompletionDomainHandler(server);
@@ -96,6 +101,7 @@
     super.tearDown();
     analysisDomain = null;
     completionDomain = null;
+    AnalysisEngine.instance.useTaskModel = wasTaskModelEnabled;
   }
 
   /**
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
new file mode 100644
index 0000000..c1cabe0
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart 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.
+
+library test.integration.analysis.analysis_options;
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import '../integration_tests.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(OptionsIntegrationTest);
+}
+
+@reflectiveTest
+class OptionsIntegrationTest extends AbstractAnalysisServerIntegrationTest {
+  test_option_warning() async {
+    String options = sourcePath('.analysis_options');
+    writeFile(
+        options,
+        '''
+linter:
+  rules:
+    - camel_case_typo # :)
+''');
+
+    standardAnalysisSetup();
+
+    await analysisFinished;
+
+    expect(currentAnalysisErrors[options], isList);
+    List<AnalysisError> errors = currentAnalysisErrors[options];
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.location.file, options);
+    expect(error.severity, AnalysisErrorSeverity.WARNING);
+    expect(error.type, AnalysisErrorType.STATIC_WARNING);
+    expect(error.location.offset, 23);
+    expect(error.location.length, 'camel_case_typo'.length);
+    expect(error.location.startLine, 3);
+    expect(error.location.startColumn, 7);
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index eca1a87..1952f20 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -7,6 +7,7 @@
 import 'package:unittest/unittest.dart';
 
 import '../../utils.dart';
+import 'analysis_options_test.dart' as analysis_options_test;
 import 'error_test.dart' as error_test;
 import 'get_errors_after_analysis_test.dart' as get_errors_after_analysis_test;
 import 'get_errors_before_analysis_test.dart'
@@ -31,6 +32,7 @@
 main() {
   initializeTestEnvironment();
   group('analysis', () {
+    analysis_options_test.main();
     error_test.main();
     get_errors_after_analysis_test.main();
     get_errors_before_analysis_test.main();
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 18c3357..bfe19dd 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -854,7 +854,7 @@
   StreamController<AnalysisOutlineParams> _onAnalysisOutline;
 
   /**
-   * Reports the overridding members in a file.
+   * Reports the overriding members in a file.
    *
    * This notification is not subscribed to by default. Clients can subscribe
    * by including the value "OVERRIDES" in the list of services passed in an
@@ -1445,7 +1445,7 @@
    *
    * If directives of the Dart file cannot be organized, for example because it
    * has scan or parse errors, or by other reasons, ORGANIZE_DIRECTIVES_ERROR
-   * will be generated. The message will provide datails about the reason.
+   * will be generated. The message will provide details about the reason.
    *
    * Parameters
    *
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 347976e..6d0ec42 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1294,6 +1294,7 @@
  *   ENUM
  *   ENUM_CONSTANT
  *   FIELD
+ *   FILE
  *   FUNCTION
  *   FUNCTION_TYPE_ALIAS
  *   GETTER
@@ -1319,6 +1320,7 @@
   "ENUM",
   "ENUM_CONSTANT",
   "FIELD",
+  "FILE",
   "FUNCTION",
   "FUNCTION_TYPE_ALIAS",
   "GETTER",
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index bdf06da..e88af42 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -66,7 +66,13 @@
 
   String getPathString(List<Element> path) {
     return path.map((Element element) {
-      return '${element.kind.name} ${element.name}';
+      String kindName = element.kind.name;
+      String name = element.name;
+      if (name.isEmpty) {
+        return kindName;
+      } else {
+        return '$kindName $name';
+      }
     }).join('\n');
   }
 
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 51fa1d9..0ef1ccf 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -222,6 +222,178 @@
     assertHasResult(SearchResultKind.READ, 'fff); // in m()');
   }
 
+  test_file_libraryUnit_atImportDirective() async {
+    String fileLib = '$testFolder/my_lib.dart';
+    String fileUser = '$testFolder/userA.dart';
+    String codeUser = "import 'my_lib.dart'; // U";
+    addFile(fileLib, 'library my.lib;');
+    addFile(fileUser, codeUser);
+    addTestFile('''
+import 'my_lib.dart'; // T
+''');
+    await findElementReferences('import ', false);
+    expect(searchElement.kind, ElementKind.FILE);
+    expect(results, hasLength(2));
+    // in U
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileUser;
+      });
+      expect(result.location.offset, codeUser.indexOf("'my_lib.dart'; // U"));
+      expect(result.location.length, "'my_lib.dart'".length);
+    }
+    // in T
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == testFile;
+      });
+      expect(result.location.offset, testCode.indexOf("'my_lib.dart'; // T"));
+      expect(result.location.length, "'my_lib.dart'".length);
+    }
+  }
+
+  test_file_libraryUnit_atImportDirectiveUri() async {
+    String fileLib = '$testFolder/my_lib.dart';
+    String fileA = '$testFolder/userA.dart';
+    String fileB = '$testFolder/userB.dart';
+    String codeA = "import 'my_lib.dart'; // A";
+    String codeB = "export 'my_lib.dart'; // B";
+    addFile(fileLib, 'library my.lib;');
+    addFile(fileA, codeA);
+    addFile(fileB, codeB);
+    addTestFile('''
+import 'my_lib.dart'; // T
+''');
+    await findElementReferences('my_', false);
+    expect(searchElement.kind, ElementKind.FILE);
+    expect(results, hasLength(3));
+    // in A
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileA;
+      });
+      expect(result.location.offset, codeA.indexOf("'my_lib.dart'; // A"));
+      expect(result.location.length, "'my_lib.dart'".length);
+    }
+    // in B
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileB;
+      });
+      expect(result.location.offset, codeB.indexOf("'my_lib.dart'; // B"));
+      expect(result.location.length, "'my_lib.dart'".length);
+    }
+    // in T
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == testFile;
+      });
+      expect(result.location.offset, testCode.indexOf("'my_lib.dart'; // T"));
+      expect(result.location.length, "'my_lib.dart'".length);
+    }
+  }
+
+  test_file_libraryUnit_atLibraryDirectiveIdentifier() async {
+    String fileA = '$testFolder/userA.dart';
+    String fileB = '$testFolder/userB.dart';
+    String codeA = "import 'test.dart'; // A";
+    String codeB = "export 'test.dart'; // B";
+    addFile(fileA, codeA);
+    addFile(fileB, codeB);
+    addTestFile('''
+library my.test.lib;
+''');
+    await findElementReferences('test.', false);
+    expect(searchElement.kind, ElementKind.LIBRARY);
+    expect(results, hasLength(2));
+    // in A
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileA;
+      });
+      expect(result.location.offset, codeA.indexOf("'test.dart'; // A"));
+      expect(result.location.length, "'test.dart'".length);
+    }
+    // in B
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileB;
+      });
+      expect(result.location.offset, codeB.indexOf("'test.dart'; // B"));
+      expect(result.location.length, "'test.dart'".length);
+    }
+  }
+
+  test_file_partUnit_atPartDirective() async {
+    String filePart = '$testFolder/my_part.dart';
+    String fileOther = '$testFolder/userOther.dart';
+    String codeOther = '''
+library lib;
+part 'my_part.dart'; // O
+''';
+    addFile(filePart, 'part of lib;');
+    addFile(fileOther, codeOther);
+    addTestFile('''
+library lib;
+part 'my_part.dart'; // T
+''');
+    await findElementReferences('part ', false);
+    expect(searchElement.kind, ElementKind.FILE);
+    expect(searchElement.name, filePart);
+    expect(results, hasLength(2));
+    // in O
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileOther;
+      });
+      expect(result.location.offset, codeOther.indexOf("'my_part.dart'; // O"));
+      expect(result.location.length, "'my_part.dart'".length);
+    }
+    // in T
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == testFile;
+      });
+      expect(result.location.offset, testCode.indexOf("'my_part.dart'; // T"));
+      expect(result.location.length, "'my_part.dart'".length);
+    }
+  }
+
+  test_file_partUnit_atPartDirectiveUri() async {
+    String filePart = '$testFolder/my_part.dart';
+    String fileOther = '$testFolder/userOther.dart';
+    String codeOther = '''
+library lib;
+part 'my_part.dart'; // O
+''';
+    addFile(filePart, 'part of lib;');
+    addFile(fileOther, codeOther);
+    addTestFile('''
+library lib;
+part 'my_part.dart'; // T
+''');
+    await findElementReferences('my_', false);
+    expect(searchElement.kind, ElementKind.FILE);
+    expect(searchElement.name, filePart);
+    expect(results, hasLength(2));
+    // in O
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == fileOther;
+      });
+      expect(result.location.offset, codeOther.indexOf("'my_part.dart'; // O"));
+      expect(result.location.length, "'my_part.dart'".length);
+    }
+    // in T
+    {
+      SearchResult result = results.singleWhere((result) {
+        return result.location.file == testFile;
+      });
+      expect(result.location.offset, testCode.indexOf("'my_part.dart'; // T"));
+      expect(result.location.length, "'my_part.dart'".length);
+    }
+  }
+
   test_function() async {
     addTestFile('''
 fff(p) {}
@@ -480,7 +652,7 @@
         getPathString(result.path),
         '''
 LOCAL_VARIABLE a
-CONSTRUCTOR 
+CONSTRUCTOR
 CLASS B
 COMPILATION_UNIT test.dart
 LIBRARY my_lib''');
@@ -608,18 +780,6 @@
     assertHasResult(SearchResultKind.REFERENCE, 'ppp.Stream');
   }
 
-  test_prefix_null() async {
-    addTestFile('''
-import 'dart:async';
-main() {
-  Future a;
-  Stream b;
-}
-''');
-    await findElementReferences("import ", false);
-    expect(searchElement, isNull);
-  }
-
   test_topLevelVariable_explicit() async {
     addTestFile('''
 var vvv = 1;
diff --git a/pkg/analysis_server/test/services/completion/completion_computer_test.dart b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 48f9fe6..21b3393 100644
--- a/pkg/analysis_server/test/services/completion/completion_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -113,7 +113,7 @@
       // There is only one notification
       expect(count, equals(1));
     });
-    return pumpEventQueue().then((_) {
+    return pumpEventQueue(150).then((_) {
       expect(done, isTrue);
     });
   }
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index 8edd486..a533731 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -3771,6 +3771,14 @@
     });
   }
 
+  test_parameterName_excludeTypes() {
+    addTestSource('m(int ^) {}');
+    return computeFull((bool result) {
+      assertNotSuggested('int');
+      assertNotSuggested('bool');
+    });
+  }
+
   test_partFile_TypeName() {
     // SimpleIdentifier  TypeName  ConstructorName
     addSource(
@@ -4216,6 +4224,14 @@
     });
   }
 
+  test_localVariableDeclarationName() {
+    addTestSource('main() {String m^}');
+    return computeFull((bool result) {
+      assertNotSuggested('main');
+      assertNotSuggested('min');
+    });
+  }
+
   test_PrefixedIdentifier_trailingStmt_param2() {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('f(String g) {g.^ int y = 0;}');
diff --git a/pkg/analysis_server/test/services/completion/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/imported_reference_contributor_test.dart
index 2f2a3f8..95cbb70 100644
--- a/pkg/analysis_server/test/services/completion/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_reference_contributor_test.dart
@@ -490,6 +490,17 @@
     });
   }
 
+  test_inComment_endOfLine() {
+    addTestSource('''
+main() {
+  // text ^
+}
+''');
+    return computeFull((bool result) {
+      assertNoSuggestions();
+    });
+  }
+
   test_InstanceCreationExpression() {
     addSource(
         '/testA.dart',
diff --git a/pkg/analysis_server/test/services/completion/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/keyword_contributor_test.dart
index 043e89c..4a2085f 100644
--- a/pkg/analysis_server/test/services/completion/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/keyword_contributor_test.dart
@@ -436,8 +436,7 @@
     var keywords = <Keyword>[];
     keywords.addAll(STMT_START_OUTSIDE_CLASS);
     keywords.add(Keyword.RETHROW);
-    assertSuggestKeywords(keywords,
-        relevance: DART_RELEVANCE_KEYWORD);
+    assertSuggestKeywords(keywords, relevance: DART_RELEVANCE_KEYWORD);
   }
 
   test_class() {
@@ -1036,6 +1035,27 @@
     expect(request.replacementLength, 3);
   }
 
+  test_inComment_block() {
+    addTestSource('''
+main() {
+  /* text ^ */
+  print(42);
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNoSuggestions();
+  }
+
+  test_inComment_endOfLine() {
+    addTestSource('''
+main() {
+  // text ^
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNoSuggestions();
+  }
+
   test_is_expression() {
     addTestSource('main() {if (x is^)}');
     expect(computeFast(), isTrue);
diff --git a/pkg/analysis_server/test/services/completion/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/local_reference_contributor_test.dart
index 28ceb3d..700f414 100644
--- a/pkg/analysis_server/test/services/completion/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_reference_contributor_test.dart
@@ -603,6 +603,38 @@
     assertNotSuggested('MC');
   }
 
+  test_inComment_block_beforeNode() {
+    addTestSource('''
+main(aaa, bbb) {
+  /* text ^ */
+  print(42);
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNoSuggestions();
+  }
+
+  test_inComment_endOfLine_beforeNode() {
+    addTestSource('''
+main(aaa, bbb) {
+  // text ^
+  print(42);
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNoSuggestions();
+  }
+
+  test_inComment_endOfLine_beforeToken() {
+    addTestSource('''
+main(aaa, bbb) {
+  // text ^
+}
+''');
+    expect(computeFast(), isTrue);
+    assertNoSuggestions();
+  }
+
   test_InstanceCreationExpression() {
     addTestSource('''
 class A {foo(){var f; {var x;}}}
diff --git a/pkg/analysis_server/test/services/completion/optype_test.dart b/pkg/analysis_server/test/services/completion/optype_test.dart
index a2bf5c8..94b5daf 100644
--- a/pkg/analysis_server/test/services/completion/optype_test.dart
+++ b/pkg/analysis_server/test/services/completion/optype_test.dart
@@ -631,7 +631,7 @@
   test_FunctionDeclaration_inLineComment4() {
     // Comment  CompilationUnit
     addTestSource('''
-      // normal comment 
+      // normal comment
       // normal comment 2^
       zoo(z) { } String name;''');
     assertOpType();
@@ -952,7 +952,7 @@
     // Comment  ClassDeclaration  CompilationUnit
     addTestSource('''
       class C2 {
-        // normal comment 
+        // normal comment
         // normal comment 2^
         zoo(z) { } String name; }''');
     assertOpType();
@@ -1142,12 +1142,60 @@
     assertOpType(returnValue: true, typeNames: true);
   }
 
-  test_SimpleFormalParameter() {
+  test_SimpleFormalParameter_closure() {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('mth() { PNGS.sort((String a, Str^) => a.compareTo(b)); }');
     assertOpType(typeNames: true);
   }
 
+  test_SimpleFormalParameter_name1() {
+    // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
+    addTestSource('m(String na^) {}');
+    assertOpType(typeNames: false);
+  }
+
+  test_SimpleFormalParameter_name2() {
+    // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
+    addTestSource('m(int first, String na^) {}');
+    assertOpType(typeNames: false);
+  }
+
+  test_SimpleFormalParameter_type_optionalNamed() {
+    // SimpleIdentifier  DefaultFormalParameter  FormalParameterList
+    addTestSource('m({Str^}) {}');
+    assertOpType(typeNames: true);
+  }
+
+  test_SimpleFormalParameter_type_optionalPositional() {
+    // SimpleIdentifier  DefaultFormalParameter  FormalParameterList
+    addTestSource('m([Str^]) {}');
+    assertOpType(typeNames: true);
+  }
+
+  test_SimpleFormalParameter_type_withName() {
+    // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
+    addTestSource('m(Str^ name) {}');
+    assertOpType(typeNames: true);
+  }
+
+  test_SimpleFormalParameter_type_withoutName1() {
+    // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
+    addTestSource('m(Str^) {}');
+    assertOpType(typeNames: true);
+  }
+
+  test_SimpleFormalParameter_type_withoutName2() {
+    // FormalParameterList
+    addTestSource('m(^) {}');
+    assertOpType(typeNames: true);
+  }
+
+  test_SimpleFormalParameter_type_withoutName3() {
+    // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
+    addTestSource('m(int first, Str^) {}');
+    assertOpType(typeNames: true);
+  }
+
   test_SwitchCase_before() {
     // SwitchCase  SwitchStatement  Block
     addTestSource('main() {switch(k) {^case 1:}}');
@@ -1320,6 +1368,20 @@
     assertOpType();
   }
 
+  test_VariableDeclaration_name_hasSome_parameterizedType() {
+    // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
+    // VariableDeclarationStatement  Block
+    addTestSource('main() {List<int> m^}');
+    assertOpType();
+  }
+
+  test_VariableDeclaration_name_hasSome_simpleType() {
+    // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
+    // VariableDeclarationStatement  Block
+    addTestSource('main() {String m^}');
+    assertOpType();
+  }
+
   test_VariableDeclarationList_final() {
     // VariableDeclarationList  VariableDeclarationStatement  Block
     addTestSource('main() {final ^}');
diff --git a/pkg/analysis_server/test/services/completion/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/uri_contributor_test.dart
index ab605dd..22ebe15 100644
--- a/pkg/analysis_server/test/services/completion/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/uri_contributor_test.dart
@@ -28,6 +28,46 @@
     contributor = new UriContributor();
   }
 
+  test_after_import() {
+    addTestSource('import "p"^');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertNoSuggestions();
+  }
+
+  test_after_import_raw() {
+    addTestSource('import r"p"^');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertNoSuggestions();
+  }
+
+  test_before_import() {
+    addTestSource('import ^"p"');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertNoSuggestions();
+  }
+
+  test_before_import_raw() {
+    addTestSource('import ^r"p"');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertNoSuggestions();
+  }
+
+  test_before_import_raw2() {
+    addTestSource('import r^"p"');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertNoSuggestions();
+  }
+
   test_export_package2() {
     addPackageSource('foo', 'foo.dart', 'library foo;');
     addPackageSource('foo', 'baz/too.dart', 'library too;');
@@ -196,6 +236,16 @@
         csKind: CompletionSuggestionKind.IMPORT);
   }
 
+  test_import_package2_raw() {
+    addPackageSource('foo', 'foo.dart', 'library foo;');
+    addPackageSource('foo', 'baz/too.dart', 'library too;');
+    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addTestSource('import r"package:foo/baz/^" import');
+    computeFast();
+    assertSuggest('package:foo/baz/too.dart',
+        csKind: CompletionSuggestionKind.IMPORT);
+  }
+
   test_import_package_missing_lib() {
     var pkgSrc = addPackageSource('bar', 'bar.dart', 'library bar;');
     provider.deleteFolder(dirname(pkgSrc.fullName));
@@ -208,6 +258,34 @@
     assertNotSuggested('package:bar/bar.dart');
   }
 
+  test_import_package_raw() {
+    addPackageSource('foo', 'foo.dart', 'library foo;');
+    addPackageSource('foo', 'baz/too.dart', 'library too;');
+    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addTestSource('import r"p^" import');
+    computeFast();
+    expect(request.replacementOffset, completionOffset - 1);
+    expect(request.replacementLength, 1);
+    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('package:foo/foo.dart',
+        csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('package:foo/baz/', csKind: CompletionSuggestionKind.IMPORT);
+    assertNotSuggested('package:foo/baz/too.dart');
+    assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('package:bar/bar.dart',
+        csKind: CompletionSuggestionKind.IMPORT);
+  }
+
+  test_import_raw() {
+    addTestSource('import r"^" import');
+    computeFast();
+    expect(request.replacementOffset, completionOffset);
+    expect(request.replacementLength, 0);
+    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
+  }
+
   test_outside_import() {
     addTestSource('import ^"d" import');
     computeFast();
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 6d01cbb..2885f27 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -794,6 +794,26 @@
     assertNoAssistAt('vvv =', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
   }
 
+  void test_assignToLocalVariable_inClosure() {
+    resolveTestUnit(r'''
+main() {
+  print(() {
+    12345;
+  });
+}
+''');
+    assertHasAssistAt(
+        '345',
+        DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE,
+        '''
+main() {
+  print(() {
+    var i = 12345;
+  });
+}
+''');
+  }
+
   void test_assignToLocalVariable_invocationArgument() {
     resolveTestUnit(r'''
 main() {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index c42ed2d..14f2fc8 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -5,7 +5,8 @@
 library test.services.correction.fix;
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/plugin/protocol/protocol.dart' hide AnalysisError;
+import 'package:analysis_server/plugin/protocol/protocol.dart'
+    hide AnalysisError;
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -1543,6 +1544,37 @@
 ''');
   }
 
+  void test_createGetter_location_afterLastGetter() {
+    resolveTestUnit('''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+    assertHasFix(
+        DartFixKind.CREATE_GETTER,
+        '''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  int get test => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+}
+''');
+  }
+
   void test_createGetter_multiLevel() {
     resolveTestUnit('''
 class A {
@@ -2212,37 +2244,6 @@
 ''');
   }
 
-  void test_creatGetter_location_afterLastGetter() {
-    resolveTestUnit('''
-class A {
-  int existingField;
-
-  int get existingGetter => null;
-
-  existingMethod() {}
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-    assertHasFix(
-        DartFixKind.CREATE_GETTER,
-        '''
-class A {
-  int existingField;
-
-  int get existingGetter => null;
-
-  int get test => null;
-
-  existingMethod() {}
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-  }
-
   void test_creationFunction_forFunctionType_cascadeSecond() {
     resolveTestUnit('''
 class A {
@@ -2647,6 +2648,41 @@
 ''');
   }
 
+  void test_importLibraryProject_withClass_hasOtherLibraryWithPrefix() {
+    testFile = '/project/bin/test.dart';
+    addSource(
+        '/project/bin/a.dart',
+        '''
+library a;
+class One {}
+''');
+    addSource(
+        '/project/bin/b.dart',
+        '''
+library b;
+class One {}
+class Two {}
+''');
+    resolveTestUnit('''
+import 'b.dart' show Two;
+main () {
+  new Two();
+  new One();
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(
+        DartFixKind.IMPORT_LIBRARY_PROJECT,
+        '''
+import 'b.dart' show Two;
+import 'a.dart';
+main () {
+  new Two();
+  new One();
+}
+''');
+  }
+
   void test_importLibraryProject_withClass_inParentFolder() {
     testFile = '/project/bin/test.dart';
     addSource(
diff --git a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index 585366a..1830a28 100644
--- a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/services/index/index_contributor.dart';
 import 'package:analysis_server/src/services/index/index_store.dart';
 import 'package:analysis_server/src/services/index/indexable_element.dart';
+import 'package:analysis_server/src/services/index/indexable_file.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -34,16 +35,21 @@
  * Returns `true` if the [actual] location the same properties as [expected].
  */
 bool _equalsLocation(LocationImpl actual, ExpectedLocation expected) {
-  return _equalsLocationProperties(actual, expected.element, expected.offset,
+  return _equalsLocationProperties(actual, expected.indexable, expected.offset,
       expected.length, expected.isQualified, expected.isResolved);
 }
 
 /**
  * Returns `true` if the [actual] location the expected properties.
  */
-bool _equalsLocationProperties(LocationImpl actual, Element expectedElement,
-    int expectedOffset, int expectedLength, bool isQualified, bool isResolved) {
-  return (expectedElement == null || expectedElement == actual.element) &&
+bool _equalsLocationProperties(
+    LocationImpl actual,
+    IndexableObject expectedIndexable,
+    int expectedOffset,
+    int expectedLength,
+    bool isQualified,
+    bool isResolved) {
+  return (expectedIndexable == null || expectedIndexable == actual.indexable) &&
       expectedOffset == actual.offset &&
       expectedLength == actual.length &&
       isQualified == actual.isQualified &&
@@ -88,6 +94,27 @@
     });
   }
 
+  void test_isReferencedBy_PrefixElement() {
+    _indexTestUnit('''
+import 'dart:async' as ppp;
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    // prepare elements
+    PrefixElement element = findNodeElementAtString('ppp;');
+    Element elementA = findElement('a');
+    Element elementB = findElement('b');
+    IndexableElement indexable = new IndexableElement(element);
+    // verify
+    _assertRecordedRelation(indexable, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(elementA, 'ppp.Future'));
+    _assertRecordedRelation(indexable, IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(elementB, 'ppp.Stream'));
+    _assertNoRecordedRelation(indexable, null, _expectedLocation(null, 'ppp;'));
+  }
+
   void test_bad_unresolvedFieldFormalParameter() {
     verifyNoTestUnitErrors = false;
     _indexTestUnit('''
@@ -1031,6 +1058,51 @@
         _expectedLocation(mainElement, 'field: 3'));
   }
 
+  void test_isReferencedBy_fileOfLibrary_byImportingExportingFile() {
+    addSource('/lib.dart', '');
+    _indexTestUnit('''
+import 'lib.dart'; // 1
+export 'lib.dart'; // 2
+''');
+    // verify
+    IndexableFile libIndexableFile = new IndexableFile('/lib.dart');
+    IndexableFile testIndexableFile = new IndexableFile(testFile);
+    _assertRecordedRelationForIndexable(
+        libIndexableFile,
+        IndexConstants.IS_REFERENCED_BY,
+        new ExpectedLocation(
+            testIndexableFile,
+            testCode.indexOf("'lib.dart'; // 1"),
+            "'lib.dart'".length,
+            false,
+            true));
+    _assertRecordedRelationForIndexable(
+        libIndexableFile,
+        IndexConstants.IS_REFERENCED_BY,
+        new ExpectedLocation(
+            testIndexableFile,
+            testCode.indexOf("'lib.dart'; // 2"),
+            "'lib.dart'".length,
+            false,
+            true));
+  }
+
+  void test_isReferencedBy_fileOfPart_bySourcingFile() {
+    addSource('/part.dart', 'part of my.lib;');
+    _indexTestUnit('''
+library my.lib;
+part 'part.dart';
+''');
+    // verify
+    IndexableFile partIndexableFile = new IndexableFile('/part.dart');
+    IndexableFile testIndexableFile = new IndexableFile(testFile);
+    _assertRecordedRelationForIndexable(
+        partIndexableFile,
+        IndexConstants.IS_REFERENCED_BY,
+        new ExpectedLocation(testIndexableFile, testCode.indexOf("'part.dart'"),
+            "'part.dart'".length, false, true));
+  }
+
   void test_isReferencedBy_FunctionElement() {
     _indexTestUnit('''
 foo() {}
@@ -1296,7 +1368,7 @@
         _expectedLocation(mainElement, 'L;'));
   }
 
-  void test_isReferencedBy_libraryName() {
+  void test_isReferencedBy_libraryName_byPartOf() {
     Source libSource = addSource(
         '/lib.dart',
         '''
@@ -1351,27 +1423,6 @@
         _expectedLocation(mainElement, 'p: 1'));
   }
 
-  void test_isReferencedBy_PrefixElement() {
-    _indexTestUnit('''
-import 'dart:async' as ppp;
-main() {
-  ppp.Future a;
-  ppp.Stream b;
-}
-''');
-    // prepare elements
-    PrefixElement element = findNodeElementAtString('ppp;');
-    Element elementA = findElement('a');
-    Element elementB = findElement('b');
-    IndexableElement indexable = new IndexableElement(element);
-    // verify
-    _assertRecordedRelation(indexable, IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(elementA, 'ppp.Future'));
-    _assertRecordedRelation(indexable, IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(elementB, 'ppp.Stream'));
-    _assertNoRecordedRelation(indexable, null, _expectedLocation(null, 'ppp;'));
-  }
-
   void test_isReferencedBy_TopLevelVariableElement() {
     addSource(
         '/lib.dart',
@@ -1596,7 +1647,11 @@
 
   void _assertDefinesTopLevelElement(Element element) {
     ExpectedLocation location = new ExpectedLocation(
-        element, element.nameOffset, element.nameLength, false, true);
+        new IndexableElement(element),
+        element.nameOffset,
+        element.nameLength,
+        false,
+        true);
     _assertRecordedRelationForElement(
         testLibraryElement, IndexConstants.DEFINES, location);
     expect(recordedTopElements, contains(element));
@@ -1685,8 +1740,10 @@
     if (length == -1) {
       length = getLeadingIdentifierLength(search);
     }
+    IndexableObject indexable =
+        element != null ? new IndexableElement(element) : null;
     return new ExpectedLocation(
-        element, offset, length, isQualified, isResolved);
+        indexable, offset, length, isQualified, isResolved);
   }
 
   ExpectedLocation _expectedLocationQ(Element element, String search,
@@ -1708,18 +1765,18 @@
 }
 
 class ExpectedLocation {
-  Element element;
+  IndexableObject indexable;
   int offset;
   int length;
   bool isQualified;
   bool isResolved;
 
-  ExpectedLocation(this.element, this.offset, this.length, this.isQualified,
+  ExpectedLocation(this.indexable, this.offset, this.length, this.isQualified,
       this.isResolved);
 
   @override
   String toString() {
-    return 'ExpectedLocation(element=$element; offset=$offset; length=$length;'
+    return 'ExpectedLocation(indexable=$indexable; offset=$offset; length=$length;'
         ' isQualified=$isQualified isResolved=$isResolved)';
   }
 }
diff --git a/pkg/analysis_server/test/services/index/indexable_file_test.dart b/pkg/analysis_server/test/services/index/indexable_file_test.dart
new file mode 100644
index 0000000..e790b84
--- /dev/null
+++ b/pkg/analysis_server/test/services/index/indexable_file_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2015, the Dart 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.
+
+library test.services.index.indexable_file;
+
+import 'package:analysis_server/src/services/index/indexable_file.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(IndexableFileKindTest);
+  defineReflectiveTests(IndexableFileTest);
+}
+
+@reflectiveTest
+class IndexableFileKindTest {
+  void test_decode() {
+    IndexableFile object =
+        IndexableFileKind.INSTANCE.decode(null, '/a.dart', -1);
+    expect(object.path, '/a.dart');
+  }
+
+  void test_encodeHash() {
+    StringCodec stringCodec = new StringCodec();
+    String path = '/a/bb/ccc.dart';
+    int hash1 = IndexableFileKind.INSTANCE
+        .encodeHash(stringCodec.encode, new IndexableFile(path));
+    int hash2 = IndexableFileKind.INSTANCE
+        .encodeHash(stringCodec.encode, new IndexableFile(path));
+    expect(hash2, hash1);
+  }
+}
+
+@reflectiveTest
+class IndexableFileTest {
+  void test_equals() {
+    IndexableFile a = new IndexableFile('/a.dart');
+    IndexableFile a2 = new IndexableFile('/a.dart');
+    IndexableFile b = new IndexableFile('/b.dart');
+    expect(a == a, isTrue);
+    expect(a == a2, isTrue);
+    expect(a == b, isFalse);
+  }
+
+  void test_getters() {
+    String path = '/a/bb/ccc.dart';
+    IndexableFile indexable = new IndexableFile(path);
+    expect(indexable.kind, IndexableFileKind.INSTANCE);
+    expect(indexable.filePath, path);
+    expect(indexable.offset, -1);
+    expect(indexable.toString(), path);
+  }
+}
diff --git a/pkg/analysis_server/test/services/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart
index d0d0322..ab91ca6 100644
--- a/pkg/analysis_server/test/services/index/store/split_store_test.dart
+++ b/pkg/analysis_server/test/services/index/store/split_store_test.dart
@@ -637,6 +637,10 @@
     });
   }
 
+  void test_aboutToIndexDart_nullContext() {
+    expect(store.aboutToIndex(null, unitElementA), isFalse);
+  }
+
   void test_aboutToIndexDart_nullLibraryElement() {
     when(unitElementA.library).thenReturn(null);
     expect(store.aboutToIndex(contextA, unitElementA), isFalse);
diff --git a/pkg/analysis_server/test/services/index/test_all.dart b/pkg/analysis_server/test/services/index/test_all.dart
index 39bbe6e..8f64484 100644
--- a/pkg/analysis_server/test/services/index/test_all.dart
+++ b/pkg/analysis_server/test/services/index/test_all.dart
@@ -8,6 +8,7 @@
 
 import '../../utils.dart';
 import 'dart_index_contributor_test.dart' as dart_index_contributor_test;
+import 'indexable_file_test.dart' as indexable_file_test;
 import 'local_file_index_test.dart' as local_file_index_test;
 import 'local_index_test.dart' as local_index_test;
 import 'store/test_all.dart' as store_test_all;
@@ -19,6 +20,7 @@
   initializeTestEnvironment();
   group('index', () {
     dart_index_contributor_test.main();
+    indexable_file_test.main();
     local_file_index_test.main();
     local_index_test.main();
     store_test_all.main();
diff --git a/pkg/analysis_server/test/services/linter/linter_test.dart b/pkg/analysis_server/test/services/linter/linter_test.dart
new file mode 100644
index 0000000..a1f57eb
--- /dev/null
+++ b/pkg/analysis_server/test/services/linter/linter_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2015, the Dart 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.
+
+library test.services.linter;
+
+import 'package:analysis_server/src/services/linter/linter.dart';
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  defineReflectiveTests(LinterRuleOptionsValidatorTest);
+}
+
+@reflectiveTest
+class LinterRuleOptionsValidatorTest {
+  final LinterRuleOptionsValidator validator= new LinterRuleOptionsValidator();
+  final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
+
+  RecordingErrorListener recorder;
+  ErrorReporter reporter;
+
+  List<AnalysisError> get errors => recorder.errors;
+
+  setUp() {
+    recorder = new RecordingErrorListener();
+    reporter = new ErrorReporter(recorder, new _TestSource());
+  }
+
+  test_linter_defined_rules() {
+    validate(
+        '''
+linter:
+  rules:
+    - camel_case_types
+    ''',
+        []);
+  }
+
+  test_linter_no_rules() {
+    validate(
+        '''
+linter:
+  rules:
+    ''',
+        []);
+  }
+
+  test_linter_undefined_rule() {
+    validate(
+        '''
+linter:
+  rules:
+    - undefined
+    ''',
+        [UNDEFINED_LINT_WARNING]);
+  }
+
+  validate(String source, List<AnalysisOptionsErrorCode> expected) {
+    var options = optionsProvider.getOptionsFromString(source);
+    validator.validate(reporter, options);
+    expect(errors.map((AnalysisError e) => e.errorCode),
+        unorderedEquals(expected));
+  }
+}
+
+class _TestSource implements Source {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analysis_server/test/services/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
index baef17c..e0c2086 100644
--- a/pkg/analysis_server/test/services/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -9,6 +9,7 @@
 import 'correction/test_all.dart' as correction_all;
 import 'dependencies/test_all.dart' as dependencies_all;
 import 'index/test_all.dart' as index_all;
+import 'linter/linter_test.dart' as linter_all;
 import 'refactoring/test_all.dart' as refactoring_all;
 import 'search/test_all.dart' as search_all;
 
@@ -19,6 +20,7 @@
   correction_all.main();
   dependencies_all.main();
   index_all.main();
+  linter_all.main();
   refactoring_all.main();
   search_all.main();
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index a8bd4dc..b77f4ef 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -71,7 +71,7 @@
    * that are generated.
    */
   static const String disclaimer =
-      'Clients are not expected to subtype this class.';
+      'Clients may not extend, implement or mix-in this class.';
 
   /**
    * Visitor used to produce doc comments.
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 0e2176a..83223c6 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -361,7 +361,7 @@
    *
    * If directives of the Dart file cannot be organized, for example because it has scan or parse
    * errors, or by other reasons, ORGANIZE_DIRECTIVES_ERROR will be generated. The message will
-   * provide datails about the reason.
+   * provide details about the reason.
    *
    * @param file The Dart file to organize directives in.
    */
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
index cefc511..afdde92 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
@@ -73,7 +73,7 @@
   private final Boolean enableNullAwareOperators;
 
   /**
-   * True if the client wants to enable spport for the proposed "less restricted mixins" proposal
+   * True if the client wants to enable support for the proposed "less restricted mixins" proposal
    * (DEP 34).
    */
   private final Boolean enableSuperMixins;
@@ -186,7 +186,7 @@
   }
 
   /**
-   * True if the client wants to enable spport for the proposed "less restricted mixins" proposal
+   * True if the client wants to enable support for the proposed "less restricted mixins" proposal
    * (DEP 34).
    */
   public Boolean getEnableSuperMixins() {
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
index 7426bda..b84c921 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
@@ -37,6 +37,8 @@
 
   public static final String FIELD = "FIELD";
 
+  public static final String FILE = "FILE";
+
   public static final String FUNCTION = "FUNCTION";
 
   public static final String FUNCTION_TYPE_ALIAS = "FUNCTION_TYPE_ALIAS";
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java b/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
index ac80ee8..c360b6a 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
@@ -44,14 +44,14 @@
   public static final List<HoverInformation> EMPTY_LIST = Lists.newArrayList();
 
   /**
-   * The offset of the range of characters that encompases the cursor position and has the same hover
-   * information as the cursor position.
+   * The offset of the range of characters that encompasses the cursor position and has the same
+   * hover information as the cursor position.
    */
   private final int offset;
 
   /**
-   * The length of the range of characters that encompases the cursor position and has the same hover
-   * information as the cursor position.
+   * The length of the range of characters that encompasses the cursor position and has the same
+   * hover information as the cursor position.
    */
   private final int length;
 
@@ -228,16 +228,16 @@
   }
 
   /**
-   * The length of the range of characters that encompases the cursor position and has the same hover
-   * information as the cursor position.
+   * The length of the range of characters that encompasses the cursor position and has the same
+   * hover information as the cursor position.
    */
   public int getLength() {
     return length;
   }
 
   /**
-   * The offset of the range of characters that encompases the cursor position and has the same hover
-   * information as the cursor position.
+   * The offset of the range of characters that encompasses the cursor position and has the same
+   * hover information as the cursor position.
    */
   public int getOffset() {
     return offset;
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
index a8615d2..3730a03 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
@@ -135,7 +135,7 @@
 
   /**
    * A request was received which the analysis server does not recognize, or cannot handle in its
-   * current configuation.
+   * current configuration.
    */
   public static final String UNKNOWN_REQUEST = "UNKNOWN_REQUEST";
 
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index a48d987..8c349e3 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1071,7 +1071,7 @@
       </notification>
       <notification event="overrides">
         <p>
-          Reports the overridding members in a file.
+          Reports the overriding members in a file.
         </p>
         <p>
           This notification is not subscribed to by default. Clients
@@ -1772,7 +1772,7 @@
           If directives of the Dart file cannot be organized, for example
           because it has scan or parse errors, or by other reasons,
           <tt>ORGANIZE_DIRECTIVES_ERROR</tt> will be generated. The message
-          will provide datails about the reason.
+          will provide details about the reason.
         </p>
         <params>
           <field name="file">
@@ -2131,7 +2131,7 @@
           <field name="enableSuperMixins" optional="true">
             <ref>bool</ref>
             <p>
-              True if the client wants to enable spport for the
+              True if the client wants to enable support for the
               proposed "less restricted mixins" proposal (DEP 34).
             </p>
           </field>
@@ -2521,6 +2521,7 @@
           <value><code>ENUM</code></value>
           <value><code>ENUM_CONSTANT</code></value>
           <value><code>FIELD</code></value>
+          <value><code>FILE</code></value>
           <value><code>FUNCTION</code></value>
           <value><code>FUNCTION_TYPE_ALIAS</code></value>
           <value><code>GETTER</code></value>
@@ -2906,7 +2907,7 @@
           <field name="offset">
             <ref>int</ref>
             <p>
-              The offset of the range of characters that encompases the
+              The offset of the range of characters that encompasses the
               cursor position and has the same hover information as the
               cursor position.
             </p>
@@ -2914,7 +2915,7 @@
           <field name="length">
             <ref>int</ref>
             <p>
-              The length of the range of characters that encompases the
+              The length of the range of characters that encompasses the
               cursor position and has the same hover information as the
               cursor position.
             </p>
@@ -3693,7 +3694,7 @@
             <p>
               A request was received which the analysis server does
               not recognize, or cannot handle in its current
-              configuation.
+              configuration.
             </p>
           </value>
           <value>
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 9e2232a..4f4165d 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,19 @@
+## 0.26.1+16
+* (Internal) Options validation plugin API update.
+
+## 0.26.1+15
+* (Internal) Provisional options validation plugin API.
+
+## 0.26.1+13
+* (Internal) Plugin processing fixes.
+
+## 0.26.1+11
+* Fixes to address lint registry memory leaking.
+
+## 0.26.1+10
+* New `AnalysisContext` API for associating configuration data with contexts
+  (`setConfigurationData()` and `getConfigurationData()`).
+
 ## 0.26.1+9
 * `OptionsProcessor` extension point API changed to pass associated
   `AnalysisContext` instance into the `optionsProcessed` call-back.
diff --git a/pkg/analyzer/README.md b/pkg/analyzer/README.md
index eb5c89e..c6ad981 100644
--- a/pkg/analyzer/README.md
+++ b/pkg/analyzer/README.md
@@ -1,27 +1,113 @@
-The analysis package defines support for performing static analysis of Dart
-code. It was designed to support tooling efforts, but has also been used for
-such things as statistics gathering and code transformers.
+# Analyzer for Dart
 
-If you are interested in providing Dart support in a long-running tool, such as
-an editor or IDE, you should use the analysis server instead of this package.
-The analysis server is currently shipped as an executable in the SDK and will
-be released as a package in the near future. In the meantime, if you'd like to
-learn more about it, please look at the
-[Analysis Server API Specification](http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html)
-or contact the mailing list (see below).
+This package provides a low-level _library_ that performs static analysis
+of Dart code. It is useful for tool
+integration and embedding.
 
-The API's in this package are, quite frankly, a mess at the moment. They were
+End-users should use the [dartanalyzer][analyzercli] command-line tool
+to analyze their Dart code.
+
+Integrators that want to add Dart support to their editor
+should use the _Dart Analysis Server_.
+The [Analysis Server API Specification][serverapi] is available.
+If you are adding Dart support to an editor or IDE, please let us know
+by emailing our [list][].
+
+## Configuring the analyzer
+
+Both the dartanalyzer and Dart Analysis Server can be configured
+with a `.analysis_options` file. This YAML file can control which files
+and paths are analyzed, which lints are applied, and more.
+
+If you are embedding the analyzer library in your project, you are
+responsible for finding the `.analysis_options` file, parsing it,
+and configuring the analyzer.
+
+The `.analysis_options` file should live
+at the root of your project (for example, next to your `pubspec.yaml`).
+Different embedders of analyzer, such as dartanalyzer or Dart Analysis Server,
+may choose to find the file in various different ways. Consult their
+documentation to learn more.
+
+Here is an example file that instructs the analyzer
+to ignore two files:
+
+```
+analyzer:
+  exclude:
+    - test/_data/p4/lib/lib1.dart
+    - test/_data/p5/p5.dart
+    - test/_data/bad*.dart
+    - test/_brokendata/**
+```
+
+Note that you can use globs, as defined by the [glob package][glob].
+
+Here is an example file that enables the analyzer's [strong mode][strongmode]:
+
+```
+analyzer:
+  strong-mode: true
+```
+
+Here is an example file that enables two lint rules:
+
+```
+linter:
+  rules:
+    - camel_case_types
+    - empty_constructor_bodies
+```
+
+Check out all the available [Dart lint rules][lintrules].
+
+You can combine the `analyzer` section and the `linter` section into a single
+configuration. Here is an example:
+
+```
+analyzer:
+  exclude:
+    - test/_data/p4/lib/lib1.dart
+linter:
+  rules:
+    - camel_case_types
+```
+
+## Who uses this library?
+
+Many tools embed this library, such as:
+
+* dartfmt - a formatter for Dart code
+* dartdoc - a documentation generator for Dart code
+* Dart Analysis Server - a stateful server that supports IDEs and editors
+
+## Support
+
+Questions and requests for additional functionality are welcome.
+Please open an issue at
+[http://dartbug.com](http://dartbug.com)
+or by email
+[analyzer-discuss@dartlang.org][list].
+
+## Background
+
+The APIs in this package are, quite frankly, a mess at the moment. They were
 originally machine generated by a translator and were based on an earlier Java
 implementation. Several of the API's still look like their Java predecessors
 (or worse) rather than clean Dart API's.
 
 In addition, there is currently no clean distinction between public and internal
-API's. We plan to address this issue soon, but doing so will, unfortunately,
+APIs. We plan to address this issue but doing so will, unfortunately,
 require a large number of breaking changes. We will try to minimize the pain
 this causes for our clients, but some pain is inevitable.
 
-Questions and requests for additional functionality are welcome, and can be made
-by either opening an issue at
-[http://dartbug.com](http://dartbug.com)
-or by emailing
-[analyzer-discuss@dartlang.org](https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss).
+## License
+
+See the LICENSE file.
+
+[serverapi]: http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html
+[analyzercli]: https://github.com/dart-lang/analyzer_cli
+[list]: https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss
+[lintrules]: http://dart-lang.github.io/linter/lints/
+[strongmode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+[glob]: https://pub.dartlang.org/packages/glob
diff --git a/pkg/analyzer/lib/plugin/options.dart b/pkg/analyzer/lib/plugin/options.dart
index fb99a50..cec20c2 100644
--- a/pkg/analyzer/lib/plugin/options.dart
+++ b/pkg/analyzer/lib/plugin/options.dart
@@ -7,6 +7,7 @@
 library analyzer.plugin.options;
 
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/plugin/options_plugin.dart';
 import 'package:plugin/plugin.dart';
 import 'package:yaml/yaml.dart';
@@ -18,8 +19,17 @@
     OptionsPlugin.UNIQUE_IDENTIFIER,
     OptionsPlugin.OPTIONS_PROCESSOR_EXTENSION_POINT);
 
+/// The identifier of the extension point that allows plugins to validate
+/// options defined in the analysis options file. The object used as an
+/// extension must be an [OptionsValidator].
+final String OPTIONS_VALIDATOR_EXTENSION_POINT_ID = Plugin.join(
+    OptionsPlugin.UNIQUE_IDENTIFIER,
+    OptionsPlugin.OPTIONS_VALIDATOR_EXTENSION_POINT);
+
 /// Processes options defined in the analysis options file.
 ///
+/// Clients may implement this class when implementing plugins.
+///
 /// The options file format is intentionally very open-ended, giving clients
 /// utmost flexibility in defining their own options.  The only hardfast
 /// expectation is that options files will contain a mapping from Strings
@@ -61,3 +71,14 @@
   /// provided as well to allow for context-specific configuration.
   void optionsProcessed(AnalysisContext context, Map<String, YamlNode> options);
 }
+
+/// Validates options as defined in an analysis options file.
+///
+/// Clients may implement this class when implementing plugins.
+///
+/// See [OptionsProcessor] for a description of the options file format.
+///
+abstract class OptionsValidator {
+  /// Validate [options], reporting any errors to the given [reporter].
+  void validate(ErrorReporter reporter, Map<String, YamlNode> options);
+}
diff --git a/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
index 1c05375..29062a2 100644
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/source/analysis_options_provider.dart
@@ -5,18 +5,17 @@
 library source.analysis_options_provider;
 
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
 
 /// Provide the options found in the `.analysis_options` file.
 class AnalysisOptionsProvider {
-  /// The name of the analysis options source file.
-  static const String ANALYSIS_OPTIONS_NAME = '.analysis_options';
-
-  /// Provide the options found in [root]/[ANALYSIS_OPTIONS_NAME].
+  /// Provide the options found in [root]/[ANALYSIS_OPTIONS_FILE].
   /// Return an empty options map if the file does not exist.
   Map<String, YamlNode> getOptions(Folder root) {
-    var optionsSource =
-        _readAnalysisOptionsFile(root.getChild(ANALYSIS_OPTIONS_NAME));
+    var optionsSource = _readAnalysisOptionsFile(
+        root.getChild(AnalysisEngine.ANALYSIS_OPTIONS_FILE));
     return getOptionsFromString(optionsSource);
   }
 
@@ -34,19 +33,23 @@
     if (optionsSource == null) {
       return options;
     }
-    var doc = loadYaml(optionsSource);
+    YamlNode doc = loadYamlNode(optionsSource);
+    // Empty options.
+    if (doc is YamlScalar && doc.value == null) {
+      return options;
+    }
     if ((doc != null) && (doc is! YamlMap)) {
-      throw new Exception(
-          'Bad options file format (expected map, got ${doc.runtimeType})\n'
-          'contents of options file:\n'
-          '$optionsSource\n');
+      throw new OptionsFormatException(
+          'Bad options file format (expected map, got ${doc.runtimeType})',
+          doc.span);
     }
     if (doc is YamlMap) {
       doc.forEach((k, v) {
         if (k is! String) {
-          throw new Exception(
+          throw new OptionsFormatException(
               'Bad options file format (expected String scope key, '
-              'got ${k.runtimeType})');
+              'got ${k.runtimeType})',
+              k != null ? k.span : doc.span);
         }
         options[k] = v;
       });
@@ -65,3 +68,14 @@
     }
   }
 }
+
+/// Thrown on options format exceptions.
+class OptionsFormatException implements Exception {
+  final String message;
+  final SourceSpan span;
+  OptionsFormatException(this.message, [this.span]);
+
+  @override
+  String toString() =>
+      'OptionsFormatException: ${message?.toString()}, ${span?.toString()}';
+}
diff --git a/pkg/analyzer/lib/src/codegen/html.dart b/pkg/analyzer/lib/src/codegen/html.dart
new file mode 100644
index 0000000..4307c5c
--- /dev/null
+++ b/pkg/analyzer/lib/src/codegen/html.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2014, the Dart 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.
+
+/**
+ * Tools for manipulating HTML during code generation of analyzer and analysis
+ * server.
+ */
+library analyzer.src.codegen.html;
+
+import 'package:html/dom.dart' as dom;
+
+/**
+ * Make a deep copy of the given HTML nodes.
+ */
+List<dom.Node> cloneHtmlNodes(List<dom.Node> nodes) =>
+    nodes.map((dom.Node node) => node.clone(true)).toList();
+
+/**
+ * Return true if the given iterable contains only whitespace text nodes.
+ */
+bool containsOnlyWhitespace(Iterable<dom.Node> nodes) {
+  for (dom.Node node in nodes) {
+    if (!isWhitespaceNode(node)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
+ * Get the text contents of the element, ignoring all markup.
+ */
+String innerText(dom.Element parent) {
+  StringBuffer buffer = new StringBuffer();
+  void recurse(dom.Element parent) {
+    for (dom.Node child in parent.nodes) {
+      if (child is dom.Text) {
+        buffer.write(child.text);
+      } else if (child is dom.Element) {
+        recurse(child);
+      }
+    }
+  }
+  recurse(parent);
+  return buffer.toString();
+}
+
+/**
+ * Return true if the given node is a text node containing only whitespace, or
+ * a comment.
+ */
+bool isWhitespaceNode(dom.Node node) {
+  if (node is dom.Element) {
+    return false;
+  } else if (node is dom.Text) {
+    return node.text.trim().isEmpty;
+  }
+  // Treat all other types of nodes (e.g. comments) as whitespace.
+  return true;
+}
+
+/**
+ * Create an HTML element with the given name, attributes, and child nodes.
+ */
+dom.Element makeElement(
+    String name, Map<dynamic, String> attributes, List<dom.Node> children) {
+  dom.Element result = new dom.Element.tag(name);
+  result.attributes.addAll(attributes);
+  for (dom.Node child in children) {
+    result.append(child);
+  }
+  return result;
+}
+
+/**
+ * Mixin class for generating HTML.
+ */
+class HtmlGenerator {
+  List<dom.Node> _html;
+
+  /**
+   * Add the given [node] to the HTML output.
+   */
+  void add(dom.Node node) {
+    _html.add(node);
+  }
+
+  /**
+   * Add the given [nodes] to the HTML output.
+   */
+  void addAll(Iterable<dom.Node> nodes) {
+    for (dom.Node node in nodes) {
+      add(node);
+    }
+  }
+
+  /**
+   * Execute [callback], collecting any code that is output using [write],
+   * [writeln], [add], [addAll] or [element], and return the result as a list
+   * of HTML nodes.
+   */
+  List<dom.Node> collectHtml(void callback()) {
+    List<dom.Node> oldHtml = _html;
+    try {
+      _html = <dom.Node>[];
+      if (callback != null) {
+        callback();
+      }
+      return _html;
+    } finally {
+      _html = oldHtml;
+    }
+  }
+
+  /**
+   * Execute [callback], wrapping its output in an element with the given
+   * [name] and [attributes].
+   */
+  void element(String name, Map<dynamic, String> attributes,
+      [void callback()]) {
+    add(makeElement(name, attributes, collectHtml(callback)));
+  }
+
+  /**
+   * Output text without ending the current line.
+   */
+  void write(String text) {
+    _html.add(new dom.Text(text));
+  }
+
+  /**
+   * Output text, ending the current line.
+   */
+  void writeln([Object obj = '']) {
+    write('$obj\n');
+  }
+}
diff --git a/pkg/analyzer/lib/src/codegen/text_formatter.dart b/pkg/analyzer/lib/src/codegen/text_formatter.dart
new file mode 100644
index 0000000..28669e0
--- /dev/null
+++ b/pkg/analyzer/lib/src/codegen/text_formatter.dart
@@ -0,0 +1,247 @@
+// Copyright (c) 2014, the Dart 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.
+
+/**
+ * Code for converting HTML into text, for use during code generation of
+ * analyzer and analysis server.
+ */
+library analyzer.src.codegen.text_formatter;
+
+import 'package:html/dom.dart' as dom;
+
+import 'tools.dart';
+
+final RegExp whitespace = new RegExp(r'\s');
+
+/**
+ * Convert the HTML in [desc] into text, word wrapping at width [width].
+ *
+ * If [javadocStyle] is true, then the output is compatable with Javadoc,
+ * which understands certain HTML constructs.
+ */
+String nodesToText(List<dom.Node> desc, int width, bool javadocStyle,
+    {bool removeTrailingNewLine: false}) {
+  _TextFormatter formatter = new _TextFormatter(width, javadocStyle);
+  return formatter.collectCode(() {
+    formatter.addAll(desc);
+    formatter.lineBreak(false);
+  }, removeTrailingNewLine: removeTrailingNewLine);
+}
+
+/**
+ * Engine that transforms HTML to text.  The input HTML is processed one
+ * character at a time, gathering characters into words and words into lines.
+ */
+class _TextFormatter extends CodeGenerator {
+  /**
+   * Word-wrapping width.
+   */
+  final int width;
+
+  /**
+   * The word currently being gathered.
+   */
+  String word = '';
+
+  /**
+   * The line currently being gathered.
+   */
+  String line = '';
+
+  /**
+   * True if a blank line should be inserted before the next word.
+   */
+  bool verticalSpaceNeeded = false;
+
+  /**
+   * True if no text has been output yet.  This suppresses blank lines.
+   */
+  bool atStart = true;
+
+  /**
+   * True if we are processing a <pre> element, thus whitespace should be
+   * preserved.
+   */
+  bool preserveSpaces = false;
+
+  /**
+   * True if the output should be Javadoc compatible.
+   */
+  final bool javadocStyle;
+
+  _TextFormatter(this.width, this.javadocStyle);
+
+  /**
+   * Process an HTML node.
+   */
+  void add(dom.Node node) {
+    if (node is dom.Text) {
+      for (String char in node.text.split('')) {
+        if (preserveSpaces) {
+          wordBreak();
+          write(escape(char));
+        } else if (whitespace.hasMatch(char)) {
+          wordBreak();
+        } else {
+          resolveVerticalSpace();
+          word += escape(char);
+        }
+      }
+    } else if (node is dom.Element) {
+      switch (node.localName) {
+        case 'br':
+          lineBreak(false);
+          break;
+        case 'dl':
+        case 'dt':
+        case 'h1':
+        case 'h2':
+        case 'h3':
+        case 'h4':
+        case 'p':
+          lineBreak(true);
+          addAll(node.nodes);
+          lineBreak(true);
+          break;
+        case 'div':
+          lineBreak(false);
+          if (node.classes.contains('hangingIndent')) {
+            resolveVerticalSpace();
+            indentSpecial('', '        ', () {
+              addAll(node.nodes);
+              lineBreak(false);
+            });
+          } else {
+            addAll(node.nodes);
+            lineBreak(false);
+          }
+          break;
+        case 'ul':
+          lineBreak(false);
+          addAll(node.nodes);
+          lineBreak(false);
+          break;
+        case 'li':
+          lineBreak(false);
+          resolveVerticalSpace();
+          indentSpecial('- ', '  ', () {
+            addAll(node.nodes);
+            lineBreak(false);
+          });
+          break;
+        case 'dd':
+          lineBreak(true);
+          indent(() {
+            addAll(node.nodes);
+            lineBreak(true);
+          });
+          break;
+        case 'pre':
+          lineBreak(false);
+          resolveVerticalSpace();
+          if (javadocStyle) {
+            writeln('<pre>');
+          }
+          bool oldPreserveSpaces = preserveSpaces;
+          try {
+            preserveSpaces = true;
+            addAll(node.nodes);
+          } finally {
+            preserveSpaces = oldPreserveSpaces;
+          }
+          writeln();
+          if (javadocStyle) {
+            writeln('</pre>');
+          }
+          lineBreak(false);
+          break;
+        case 'a':
+        case 'b':
+        case 'body':
+        case 'html':
+        case 'i':
+        case 'span':
+        case 'tt':
+          addAll(node.nodes);
+          break;
+        case 'head':
+          break;
+        default:
+          throw new Exception('Unexpected HTML element: ${node.localName}');
+      }
+    } else {
+      throw new Exception('Unexpected HTML: $node');
+    }
+  }
+
+  /**
+   * Process a list of HTML nodes.
+   */
+  void addAll(List<dom.Node> nodes) {
+    for (dom.Node node in nodes) {
+      add(node);
+    }
+  }
+
+  /**
+   * Escape the given character for HTML.
+   */
+  String escape(String char) {
+    if (javadocStyle) {
+      switch (char) {
+        case '<':
+          return '&lt;';
+        case '>':
+          return '&gt;';
+        case '&':
+          return '&amp;';
+      }
+    }
+    return char;
+  }
+
+  /**
+   * Terminate the current word and/or line, if either is in progress.
+   */
+  void lineBreak(bool gap) {
+    wordBreak();
+    if (line.isNotEmpty) {
+      writeln(line);
+      line = '';
+    }
+    if (gap && !atStart) {
+      verticalSpaceNeeded = true;
+    }
+  }
+
+  /**
+   * Insert vertical space if necessary.
+   */
+  void resolveVerticalSpace() {
+    if (verticalSpaceNeeded) {
+      writeln();
+      verticalSpaceNeeded = false;
+    }
+  }
+
+  /**
+   * Terminate the current word, if a word is in progress.
+   */
+  void wordBreak() {
+    if (word.isNotEmpty) {
+      atStart = false;
+      if (line.isNotEmpty) {
+        if (indentWidth + line.length + 1 + word.length <= width) {
+          line += ' $word';
+        } else {
+          writeln(line);
+          line = word;
+        }
+      } else {
+        line = word;
+      }
+      word = '';
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/codegen/tools.dart b/pkg/analyzer/lib/src/codegen/tools.dart
new file mode 100644
index 0000000..3b2115d
--- /dev/null
+++ b/pkg/analyzer/lib/src/codegen/tools.dart
@@ -0,0 +1,557 @@
+// Copyright (c) 2014, the Dart 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.
+
+/**
+ * Tools for generating code in analyzer and analysis server.
+ */
+library analyzer.src.codegen.tools;
+
+import 'dart:io';
+
+import 'package:html/dom.dart' as dom;
+import 'package:path/path.dart';
+
+import 'html.dart';
+import 'text_formatter.dart';
+
+final RegExp trailingWhitespaceRegExp = new RegExp(r'[\n ]+$');
+final RegExp trailingSpacesInLineRegExp = new RegExp(r' +$', multiLine: true);
+
+/**
+ * Join the given strings using camelCase.  If [doCapitalize] is true, the first
+ * part will be capitalized as well.
+ */
+String camelJoin(List<String> parts, {bool doCapitalize: false}) {
+  List<String> upcasedParts = <String>[];
+  for (int i = 0; i < parts.length; i++) {
+    if (i == 0 && !doCapitalize) {
+      upcasedParts.add(parts[i]);
+    } else {
+      upcasedParts.add(capitalize(parts[i]));
+    }
+  }
+  return upcasedParts.join();
+}
+
+/**
+ * Capitalize and return the passed String.
+ */
+String capitalize(String string) {
+  return string[0].toUpperCase() + string.substring(1);
+}
+
+/**
+ * Type of functions used to compute the contents of a set of generated files.
+ */
+typedef Map<String, FileContentsComputer> DirectoryContentsComputer();
+
+/**
+ * Type of functions used to compute the contents of a generated file.
+ */
+typedef String FileContentsComputer();
+
+/**
+ * Mixin class for generating code.
+ */
+class CodeGenerator {
+  _CodeGeneratorState _state;
+
+  /**
+   * Settings that specialize code generation behavior for a given
+   * programming language.
+   */
+  CodeGeneratorSettings codeGeneratorSettings = new CodeGeneratorSettings();
+
+  /**
+   * Measure the width of the current indentation level.
+   */
+  int get indentWidth => _state.nextIndent.length;
+
+  /**
+   * Execute [callback], collecting any code that is output using [write]
+   * or [writeln], and return the result as a string.
+   */
+  String collectCode(void callback(), {bool removeTrailingNewLine: false}) {
+    _CodeGeneratorState oldState = _state;
+    try {
+      _state = new _CodeGeneratorState();
+      callback();
+      var text =
+          _state.buffer.toString().replaceAll(trailingSpacesInLineRegExp, '');
+      if (!removeTrailingNewLine) {
+        return text;
+      } else {
+        return text.replaceAll(trailingWhitespaceRegExp, '');
+      }
+    } finally {
+      _state = oldState;
+    }
+  }
+
+  /**
+   * Generate a doc comment based on the HTML in [docs].
+   *
+   * When generating java code, the output is compatible with Javadoc, which
+   * understands certain HTML constructs.
+   */
+  void docComment(List<dom.Node> docs, {bool removeTrailingNewLine: false}) {
+    if (containsOnlyWhitespace(docs)) return;
+    writeln(codeGeneratorSettings.docCommentStartMarker);
+    int width = codeGeneratorSettings.commentLineLength;
+    bool javadocStyle = codeGeneratorSettings.languageName == 'java';
+    indentBy(codeGeneratorSettings.docCommentLineLeader, () {
+      write(nodesToText(docs, width - _state.indent.length, javadocStyle,
+          removeTrailingNewLine: removeTrailingNewLine));
+    });
+    writeln(codeGeneratorSettings.docCommentEndMarker);
+  }
+
+  /**
+   * Execute [callback], indenting any code it outputs.
+   */
+  void indent(void callback()) {
+    indentSpecial(
+        codeGeneratorSettings.indent, codeGeneratorSettings.indent, callback);
+  }
+
+  /**
+   * Execute [callback], using [additionalIndent] to indent any code it outputs.
+   */
+  void indentBy(String additionalIndent, void callback()) =>
+      indentSpecial(additionalIndent, additionalIndent, callback);
+
+  /**
+   * Execute [callback], using [additionalIndent] to indent any code it outputs.
+   * The first line of output is indented by [firstAdditionalIndent] instead of
+   * [additionalIndent].
+   */
+  void indentSpecial(
+      String firstAdditionalIndent, String additionalIndent, void callback()) {
+    String oldNextIndent = _state.nextIndent;
+    String oldIndent = _state.indent;
+    try {
+      _state.nextIndent += firstAdditionalIndent;
+      _state.indent += additionalIndent;
+      callback();
+    } finally {
+      _state.nextIndent = oldNextIndent;
+      _state.indent = oldIndent;
+    }
+  }
+
+  void lineComment(List<dom.Node> docs) {
+    if (containsOnlyWhitespace(docs)) {
+      return;
+    }
+    write(codeGeneratorSettings.lineCommentLineLeader);
+    int width = codeGeneratorSettings.commentLineLength;
+    indentBy(codeGeneratorSettings.lineCommentLineLeader, () {
+      write(nodesToText(docs, width - _state.indent.length, false));
+    });
+  }
+
+  void outputHeader({bool javaStyle: false}) {
+    String header;
+    if (codeGeneratorSettings.languageName == 'java') {
+      header = '''
+/*
+ * Copyright (c) 2014, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ * This file has been automatically generated.  Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */''';
+    } else if (codeGeneratorSettings.languageName == 'python') {
+      header = '''
+# Copyright (c) 2014, the Dart 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.
+#
+# This file has been automatically generated.  Please do not edit it manually.
+# To regenerate the file, use the script
+# "pkg/analysis_server/tool/spec/generate_files".
+''';
+    } else {
+      header = '''
+// Copyright (c) 2014, the Dart 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.
+//
+// This file has been automatically generated.  Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/tool/spec/generate_files".
+''';
+    }
+    writeln(header.trim());
+  }
+
+  /**
+   * Output text without ending the current line.
+   */
+  void write(Object obj) {
+    _state.write(obj.toString());
+  }
+
+  /**
+   * Output text, ending the current line.
+   */
+  void writeln([Object obj = '']) {
+    _state.write('$obj\n');
+  }
+}
+
+/**
+ * Controls several settings of [CodeGenerator].
+ *
+ * The default settings are valid for generating Java and Dart code.
+ */
+class CodeGeneratorSettings {
+  /**
+   * Name of the language being generated. Lowercase.
+   */
+  String languageName;
+
+  /**
+   * Marker used in line comments.
+   */
+  String lineCommentLineLeader;
+
+  /**
+   * Start marker for doc comments.
+   */
+  String docCommentStartMarker;
+
+  /**
+   * Line leader for body lines in doc comments.
+   */
+  String docCommentLineLeader;
+
+  /**
+   * End marker for doc comments.
+   */
+  String docCommentEndMarker;
+
+  /**
+   * Line length for doc comment lines.
+   */
+  int commentLineLength;
+
+  /**
+   * String used for indenting code.
+   */
+  String indent;
+
+  CodeGeneratorSettings(
+      {this.languageName: 'java',
+      this.lineCommentLineLeader: '// ',
+      this.docCommentStartMarker: '/**',
+      this.docCommentLineLeader: ' * ',
+      this.docCommentEndMarker: ' */',
+      this.commentLineLength: 99,
+      this.indent: '  '});
+}
+
+abstract class GeneratedContent {
+  FileSystemEntity get outputFile;
+  bool check();
+  void generate();
+}
+
+/**
+ * Class representing a single output directory (either generated code or
+ * generated HTML). No other content should exist in the directory.
+ */
+class GeneratedDirectory extends GeneratedContent {
+  /**
+   * The path to the directory that will have the generated content.
+   */
+  final String outputDirPath;
+
+  /**
+   * Callback function that computes the directory contents.
+   */
+  final DirectoryContentsComputer directoryContentsComputer;
+
+  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
+
+  /**
+   * Get a Directory object representing the output directory.
+   */
+  Directory get outputFile =>
+      new Directory(joinAll(posix.split(outputDirPath)));
+
+  /**
+   * Check whether the directory has the correct contents, and return true if it
+   * does.
+   */
+  @override
+  bool check() {
+    Map<String, FileContentsComputer> map = directoryContentsComputer();
+    try {
+      for (String file in map.keys) {
+        FileContentsComputer fileContentsComputer = map[file];
+        String expectedContents = fileContentsComputer();
+        File outputFile =
+            new File(joinAll(posix.split(posix.join(outputDirPath, file))));
+        String actualContents = outputFile.readAsStringSync();
+        // Normalize Windows line endings to Unix line endings so that the
+        // comparison doesn't fail on Windows.
+        actualContents = actualContents.replaceAll('\r\n', '\n');
+        if (expectedContents != actualContents) {
+          return false;
+        }
+      }
+      int nonHiddenFileCount = 0;
+      outputFile
+          .listSync(recursive: false, followLinks: false)
+          .forEach((FileSystemEntity fileSystemEntity) {
+        if (fileSystemEntity is File &&
+            !basename(fileSystemEntity.path).startsWith('.')) {
+          nonHiddenFileCount++;
+        }
+      });
+      if (nonHiddenFileCount != map.length) {
+        // The number of files generated doesn't match the number we expected to
+        // generate.
+        return false;
+      }
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Replace the directory with the correct contents.  [spec] is the "tool/spec"
+   * directory.  If [spec] is unspecified, it is assumed to be the directory
+   * containing Platform.executable.
+   */
+  @override
+  void generate() {
+    try {
+      // delete the contents of the directory (and the directory itself)
+      outputFile.deleteSync(recursive: true);
+    } catch (e) {
+      // Error caught while trying to delete the directory, this can happen if
+      // it didn't yet exist.
+    }
+    // re-create the empty directory
+    outputFile.createSync(recursive: true);
+
+    // generate all of the files in the directory
+    Map<String, FileContentsComputer> map = directoryContentsComputer();
+    map.forEach((String file, FileContentsComputer fileContentsComputer) {
+      File outputFile = new File(joinAll(posix.split(outputDirPath + file)));
+      outputFile.writeAsStringSync(fileContentsComputer());
+    });
+  }
+}
+
+/**
+ * Class representing a single output file (either generated code or generated
+ * HTML).
+ */
+class GeneratedFile extends GeneratedContent {
+  /**
+   * The output file to which generated output should be written, relative to
+   * the "tool/spec" directory.  This filename uses the posix path separator
+   * ('/') regardless of the OS.
+   */
+  final String outputPath;
+
+  /**
+   * Callback function which computes the file.
+   */
+  final FileContentsComputer computeContents;
+
+  GeneratedFile(this.outputPath, this.computeContents);
+
+  /**
+   * Get a File object representing the output file.
+   */
+  File get outputFile => new File(joinAll(posix.split(outputPath)));
+
+  /**
+   * Check whether the file has the correct contents, and return true if it
+   * does.
+   */
+  @override
+  bool check() {
+    String expectedContents = computeContents();
+    try {
+      String actualContents = outputFile.readAsStringSync();
+      // Normalize Windows line endings to Unix line endings so that the
+      // comparison doesn't fail on Windows.
+      actualContents = actualContents.replaceAll('\r\n', '\n');
+      return expectedContents == actualContents;
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+  }
+
+  /**
+   * Replace the file with the correct contents.  [spec] is the "tool/spec"
+   * directory.  If [spec] is unspecified, it is assumed to be the directory
+   * containing Platform.executable.
+   */
+  void generate() {
+    outputFile.writeAsStringSync(computeContents());
+  }
+}
+
+/**
+ * Mixin class for generating HTML representations of code that are suitable
+ * for enclosing inside a <pre> element.
+ */
+abstract class HtmlCodeGenerator {
+  _HtmlCodeGeneratorState _state;
+
+  /**
+   * Add the given [node] to the HTML output.
+   */
+  void add(dom.Node node) {
+    _state.add(node);
+  }
+
+  /**
+   * Add the given [nodes] to the HTML output.
+   */
+  void addAll(Iterable<dom.Node> nodes) {
+    for (dom.Node node in nodes) {
+      _state.add(node);
+    }
+  }
+
+  /**
+   * Execute [callback], collecting any code that is output using [write],
+   * [writeln], [add], or [addAll], and return the result as a list of DOM
+   * nodes.
+   */
+  List<dom.Node> collectHtml(void callback()) {
+    _HtmlCodeGeneratorState oldState = _state;
+    try {
+      _state = new _HtmlCodeGeneratorState();
+      if (callback != null) {
+        callback();
+      }
+      return _state.buffer;
+    } finally {
+      _state = oldState;
+    }
+  }
+
+  /**
+   * Execute [callback], wrapping its output in an element with the given
+   * [name] and [attributes].
+   */
+  void element(String name, Map<String, String> attributes, [void callback()]) {
+    add(makeElement(name, attributes, collectHtml(callback)));
+  }
+
+  /**
+   * Execute [callback], indenting any code it outputs by two spaces.
+   */
+  void indent(void callback()) {
+    String oldIndent = _state.indent;
+    try {
+      _state.indent += '  ';
+      callback();
+    } finally {
+      _state.indent = oldIndent;
+    }
+  }
+
+  /**
+   * Output text without ending the current line.
+   */
+  void write(Object obj) {
+    _state.write(obj.toString());
+  }
+
+  /**
+   * Output text, ending the current line.
+   */
+  void writeln([Object obj = '']) {
+    _state.write('$obj\n');
+  }
+}
+
+/**
+ * State used by [CodeGenerator].
+ */
+class _CodeGeneratorState {
+  StringBuffer buffer = new StringBuffer();
+  String nextIndent = '';
+  String indent = '';
+  bool indentNeeded = true;
+
+  void write(String text) {
+    List<String> lines = text.split('\n');
+    for (int i = 0; i < lines.length; i++) {
+      if (i == lines.length - 1 && lines[i].isEmpty) {
+        break;
+      }
+      if (indentNeeded) {
+        buffer.write(nextIndent);
+        nextIndent = indent;
+      }
+      indentNeeded = false;
+      buffer.write(lines[i]);
+      if (i != lines.length - 1) {
+        buffer.writeln();
+        indentNeeded = true;
+      }
+    }
+  }
+}
+
+/**
+ * State used by [HtmlCodeGenerator].
+ */
+class _HtmlCodeGeneratorState {
+  List<dom.Node> buffer = <dom.Node>[];
+  String indent = '';
+  bool indentNeeded = true;
+
+  void add(dom.Node node) {
+    if (node is dom.Text) {
+      write(node.text);
+    } else {
+      buffer.add(node);
+    }
+  }
+
+  void write(String text) {
+    if (text.isEmpty) {
+      return;
+    }
+    if (indentNeeded) {
+      buffer.add(new dom.Text(indent));
+    }
+    List<String> lines = text.split('\n');
+    if (lines.last.isEmpty) {
+      lines.removeLast();
+      buffer.add(new dom.Text(lines.join('\n$indent') + '\n'));
+      indentNeeded = true;
+    } else {
+      buffer.add(new dom.Text(lines.join('\n$indent')));
+      indentNeeded = false;
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
index 4443dfa..a609421 100644
--- a/pkg/analyzer/lib/src/context/cache.dart
+++ b/pkg/analyzer/lib/src/context/cache.dart
@@ -41,20 +41,35 @@
   final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated =
       new ReentrantSynchronousStream<InvalidatedResult>();
 
+  final List<
+      ReentrantSynchronousStreamSubscription> onResultInvalidatedPartitionSubscriptions = <
+      ReentrantSynchronousStreamSubscription>[];
+
   /**
-   * Initialize a newly created cache to have the given [partitions]. The
+   * Initialize a newly created cache to have the given [_partitions]. The
    * partitions will be searched in the order in which they appear in the array,
    * so the most specific partition (usually an [SdkCachePartition]) should be
    * first and the most general (usually a [UniversalCachePartition]) last.
    */
   AnalysisCache(this._partitions) {
     for (CachePartition partition in _partitions) {
-      partition.onResultInvalidated.listen((InvalidatedResult event) {
+      ReentrantSynchronousStreamSubscription<InvalidatedResult> subscription =
+          partition.onResultInvalidated.listen((InvalidatedResult event) {
         onResultInvalidated.add(event);
       });
+      onResultInvalidatedPartitionSubscriptions.add(subscription);
     }
   }
 
+  /**
+   * Return an iterator returning all of the [Source] targets.
+   */
+  Iterable<Source> get sources {
+    return _partitions
+        .map((CachePartition partition) => partition._sources)
+        .expand((Iterable<Source> sources) => sources);
+  }
+
   // TODO(brianwilkerson) Implement or delete this.
 //  /**
 //   * Return information about each of the partitions in this cache.
@@ -73,12 +88,13 @@
 //  }
 
   /**
-   * Return an iterator returning all of the [Source] targets.
+   * Free any allocated resources and references.
    */
-  Iterable<Source> get sources {
-    return _partitions
-        .map((CachePartition partition) => partition._sources)
-        .expand((Iterable<Source> sources) => sources);
+  void dispose() {
+    for (ReentrantSynchronousStreamSubscription subscription
+        in onResultInvalidatedPartitionSubscriptions) {
+      subscription.cancel();
+    }
   }
 
   /**
@@ -1042,7 +1058,7 @@
 }
 
 /**
- * The possible results of validating analysis results againt a [Delta].
+ * The possible results of validating analysis results against a [Delta].
  */
 enum DeltaResult {
   /**
@@ -1118,8 +1134,27 @@
    * Note that if the [listener] fires a new event, then the [listener] will be
    * invoked again before returning from the [add] invocation.
    */
-  void listen(void listener(T event)) {
+  ReentrantSynchronousStreamSubscription<T> listen(void listener(T event)) {
     listeners.add(listener);
+    return new ReentrantSynchronousStreamSubscription<T>(this, listener);
+  }
+}
+
+/**
+ * A subscription on events from a [ReentrantSynchronousStream].
+ */
+class ReentrantSynchronousStreamSubscription<T> {
+  final ReentrantSynchronousStream<T> _stream;
+  final Function _listener;
+
+  ReentrantSynchronousStreamSubscription(this._stream, this._listener);
+
+  /**
+   * Cancels this subscription.
+   * It will no longer receive events.
+   */
+  void cancel() {
+    _stream.listeners.remove(_listener);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 6f7aeb7..1a8fdf8 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -115,6 +115,12 @@
   AnalysisCache _cache;
 
   /**
+   * Configuration data associated with this context.
+   */
+  final HashMap<ResultDescriptor, Object> _configurationData =
+      new HashMap<ResultDescriptor, Object>();
+
+  /**
    * The task manager used to manage the tasks used to analyze code.
    */
   TaskManager _taskManager;
@@ -638,19 +644,10 @@
         !AnalysisEngine.isDartFileName(librarySource.shortName)) {
       return new CancelableFuture.error(new AnalysisNotScheduledError());
     }
-    var unitTarget = new LibrarySpecificUnit(librarySource, unitSource);
-    return new _AnalysisFutureHelper<CompilationUnit>(this)
-        .computeAsync(unitTarget, (CacheEntry entry) {
-      CacheState state = entry.getState(RESOLVED_UNIT);
-      if (state == CacheState.ERROR) {
-        throw entry.exception;
-      } else if (state == CacheState.INVALID) {
-        return null;
-      }
-      return entry.getValue(RESOLVED_UNIT);
-    }, () {
-      dartWorkManager.addPriorityResult(unitTarget, RESOLVED_UNIT);
-    });
+    return new AnalysisFutureHelper<CompilationUnit>(
+        this,
+        new LibrarySpecificUnit(librarySource, unitSource),
+        RESOLVED_UNIT).computeAsync();
   }
 
   @override
@@ -699,6 +696,7 @@
     }
     _pendingFutureTargets.clear();
     _privatePartition.dispose();
+    _cache.dispose();
   }
 
   @override
@@ -767,6 +765,9 @@
   }
 
   @override
+  Object getConfigurationData(ResultDescriptor key) => _configurationData[key];
+
+  @override
   TimestampedData<String> getContents(Source source) {
     String contents = _contentCache.getContents(source);
     if (contents != null) {
@@ -1022,6 +1023,13 @@
     return changed;
   }
 
+  /**
+   * Invalidate analysis cache.
+   */
+  void invalidateCachedResults() {
+    _cache = createCacheFromSourceFactory(_sourceFactory);
+  }
+
   @override
   void invalidateLibraryHints(Source librarySource) {
     List<Source> sources = getResult(librarySource, UNITS);
@@ -1035,13 +1043,13 @@
   @override
   bool isClientLibrary(Source librarySource) {
     CacheEntry entry = _cache.get(librarySource);
-    return entry.getValue(IS_CLIENT) && entry.getValue(IS_LAUNCHABLE);
+    return _referencesDartHtml(librarySource) && entry.getValue(IS_LAUNCHABLE);
   }
 
   @override
   bool isServerLibrary(Source librarySource) {
     CacheEntry entry = _cache.get(librarySource);
-    return !entry.getValue(IS_CLIENT) && entry.getValue(IS_LAUNCHABLE);
+    return !_referencesDartHtml(librarySource) && entry.getValue(IS_LAUNCHABLE);
   }
 
   @override
@@ -1118,7 +1126,6 @@
       setValue(IMPORTED_LIBRARIES, Source.EMPTY_LIST);
       // IMPORT_SOURCE_CLOSURE
       setValue(INCLUDED_PARTS, Source.EMPTY_LIST);
-      setValue(IS_CLIENT, true);
       setValue(IS_LAUNCHABLE, false);
       setValue(LIBRARY_ELEMENT, library);
       setValue(LIBRARY_ELEMENT1, library);
@@ -1204,6 +1211,11 @@
   }
 
   @override
+  void setConfigurationData(ResultDescriptor key, Object data) {
+    _configurationData[key] = data;
+  }
+
+  @override
   void setContents(Source source, String contents) {
     _contentsChanged(source, contents, true);
   }
@@ -1496,7 +1508,10 @@
       CacheEntry cacheEntry = _cache.get(target);
       List<PendingFuture> pendingFutures = _pendingFutureTargets[target];
       for (int i = 0; i < pendingFutures.length;) {
-        if (pendingFutures[i].evaluate(cacheEntry)) {
+        if (cacheEntry == null) {
+          pendingFutures[i].forciblyComplete();
+          pendingFutures.removeAt(i);
+        } else if (pendingFutures[i].evaluate(cacheEntry)) {
           pendingFutures.removeAt(i);
         } else {
           i++;
@@ -1687,6 +1702,26 @@
     }
   }
 
+  bool _referencesDartHtml(Source librarySource) {
+    Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
+    Set<Source> checkedSources = new Set<Source>();
+    bool _refHtml(Source source) {
+      if (!checkedSources.add(source)) {
+        return false;
+      }
+      if (source == htmlSource) {
+        return true;
+      }
+      LibraryElement library = _cache.getValue(source, LIBRARY_ELEMENT);
+      if (library != null) {
+        return library.importedLibraries.any((x) => _refHtml(x.source)) ||
+            library.exportedLibraries.any((x) => _refHtml(x.source));
+      }
+      return false;
+    }
+    return _refHtml(librarySource);
+  }
+
   void _removeFromCache(Source source) {
     CacheEntry entry = _cache.remove(source);
     if (entry != null && !entry.explicitlyAdded) {
@@ -1716,6 +1751,7 @@
    * that referenced the source before it existed.
    */
   void _sourceAvailable(Source source) {
+    driver.reset();
     // TODO(brianwilkerson) This method needs to check whether the source was
     // previously being implicitly analyzed. If so, the cache entry needs to be
     // update to reflect the new status and an event needs to be generated to
@@ -1792,6 +1828,7 @@
       }
       entry.setState(CONTENT, CacheState.INVALID);
     }
+    driver.reset();
     for (WorkManager workManager in workManagers) {
       workManager.applyChange(
           Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST);
@@ -1833,6 +1870,7 @@
    * Record that the given [source] has been removed.
    */
   void _sourceRemoved(Source source) {
+    driver.reset();
     _removeFromCache(source);
     _removeFromPriorityOrder(source);
   }
@@ -1914,6 +1952,52 @@
 }
 
 /**
+ * A helper class used to create futures for [AnalysisContextImpl].
+ * Using a helper class allows us to preserve the generic parameter T.
+ */
+class AnalysisFutureHelper<T> {
+  final AnalysisContextImpl _context;
+  final AnalysisTarget _target;
+  final ResultDescriptor<T> _descriptor;
+
+  AnalysisFutureHelper(this._context, this._target, this._descriptor);
+
+  /**
+   * Return a future that will be completed with the result specified
+   * in the constructor. If the result is cached, the future will be
+   * completed immediately with the resulting value. If not, then
+   * analysis is scheduled that will produce the required result.
+   * If the result cannot be generated, then the future will be completed with
+   * the error AnalysisNotScheduledError.
+   */
+  CancelableFuture<T> computeAsync() {
+    if (_context.isDisposed) {
+      // No further analysis is expected, so return a future that completes
+      // immediately with AnalysisNotScheduledError.
+      return new CancelableFuture.error(new AnalysisNotScheduledError());
+    }
+    CacheEntry entry = _context.getCacheEntry(_target);
+    PendingFuture pendingFuture =
+        new PendingFuture<T>(_context, _target, (CacheEntry entry) {
+      CacheState state = entry.getState(_descriptor);
+      if (state == CacheState.ERROR) {
+        throw entry.exception;
+      } else if (state == CacheState.INVALID) {
+        return null;
+      }
+      return entry.getValue(_descriptor);
+    });
+    if (!pendingFuture.evaluate(entry)) {
+      _context._pendingFutureTargets
+          .putIfAbsent(_target, () => <PendingFuture>[])
+          .add(pendingFuture);
+      _context.dartWorkManager.addPriorityResult(_target, _descriptor);
+    }
+    return pendingFuture.future;
+  }
+}
+
+/**
  * An object that manages the partitions that can be shared between analysis
  * contexts.
  */
@@ -2052,50 +2136,3 @@
     ]);
   }
 }
-
-/**
- * A helper class used to create futures for [AnalysisContextImpl].
- * Using a helper class allows us to preserve the generic parameter T.
- */
-class _AnalysisFutureHelper<T> {
-  final AnalysisContextImpl _context;
-
-  _AnalysisFutureHelper(this._context);
-
-  /**
-   * Return a future that will be completed with the result of calling
-   * [computeValue]. If [computeValue] returns non-`null`, the future will be
-   * completed immediately with the resulting value. If it returns `null`, then
-   * [scheduleComputation] is invoked to schedule analysis that will produce
-   * the required result, and [computeValue] will be re-executed in the future,
-   * after the next time the cached information for [target] has changed. If
-   * [computeValue] throws an exception, the future will fail with that
-   * exception.
-   *
-   * If the [computeValue] still returns `null` after there is no further
-   * analysis to be done for [target], then the future will be completed with
-   * the error AnalysisNotScheduledError.
-   *
-   * Since [computeValue] will be called while the state of analysis is being
-   * updated, it should be free of side effects so that it doesn't cause
-   * reentrant changes to the analysis state.
-   */
-  CancelableFuture<T> computeAsync(AnalysisTarget target,
-      T computeValue(CacheEntry entry), void scheduleComputation()) {
-    if (_context.isDisposed) {
-      // No further analysis is expected, so return a future that completes
-      // immediately with AnalysisNotScheduledError.
-      return new CancelableFuture.error(new AnalysisNotScheduledError());
-    }
-    CacheEntry entry = _context.getCacheEntry(target);
-    PendingFuture pendingFuture =
-        new PendingFuture<T>(_context, target, computeValue);
-    if (!pendingFuture.evaluate(entry)) {
-      _context._pendingFutureTargets
-          .putIfAbsent(target, () => <PendingFuture>[])
-          .add(pendingFuture);
-      scheduleComputation();
-    }
-    return pendingFuture.future;
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 093cdab..03cb8f1 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -18345,6 +18345,7 @@
 
   @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNodeWithSuffix(node.type, " ");
     _writer.print("this.");
@@ -18470,6 +18471,7 @@
 
   @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitNodeWithSuffix(node.returnType, " ");
     _visitNode(node.identifier);
     _visitNode(node.typeParameters);
@@ -18800,6 +18802,7 @@
 
   @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNodeWithSuffix(node.type, " ");
     _visitNode(node.identifier);
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 58d6c53..aca4af5 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -311,7 +311,7 @@
     if (!identical(argumentValues[0].type, typeProvider.stringType)) {
       return false;
     }
-    String name = argumentValues[0].stringValue;
+    String name = argumentValues[0].toStringValue();
     return isValidPublicSymbol(name);
   }
 
@@ -635,7 +635,7 @@
           return null;
         }
         String variableName =
-            argumentCount < 1 ? null : argumentValues[0].stringValue;
+            argumentCount < 1 ? null : argumentValues[0].toStringValue();
         if (identical(definingClass, typeProvider.boolType)) {
           DartObject valueFromEnvironment;
           valueFromEnvironment =
@@ -670,7 +670,7 @@
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
         }
-        String argumentValue = argumentValues[0].stringValue;
+        String argumentValue = argumentValues[0].toStringValue();
         return new DartObjectImpl(
             definingClass, new SymbolState(argumentValue));
       }
@@ -1234,8 +1234,9 @@
   @override
   Object visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
+    AnalysisContext owningContext = _getOwningContext();
     constantsToCompute.add(new ConstantEvaluationTarget_Annotation(
-        context, source, librarySource, node));
+        owningContext, source, librarySource, node));
     return null;
   }
 
@@ -1285,6 +1286,14 @@
     }
     return null;
   }
+
+  AnalysisContext _getOwningContext() {
+    if (context is InternalAnalysisContext) {
+      InternalAnalysisContext internalContext = context;
+      return internalContext.getContextFor(librarySource);
+    }
+    return context;
+  }
 }
 
 /**
@@ -1607,9 +1616,9 @@
     if (conditionResult == null) {
       return conditionResult;
     }
-    if (conditionResult.isTrue) {
+    if (conditionResult.toBoolValue() == true) {
       return thenResult;
-    } else if (conditionResult.isFalse) {
+    } else if (conditionResult.toBoolValue() == false) {
       return elseResult;
     }
     ParameterizedType thenType = thenResult.type;
@@ -1945,64 +1954,214 @@
 }
 
 /**
- * The state of a Dart object.
+ * A representation of the value of a compile-time constant expression.
+ *
+ * Note that, unlike the mirrors system, the object being represented does *not*
+ * exist. This interface allows static analysis tools to determine something
+ * about the state of the object that would exist if the code that creates the
+ * object were executed, but none of the code being analyzed is actually
+ * executed.
  */
 abstract class DartObject {
   /**
    * Return the boolean value of this object, or `null` if either the value of
    * this object is not known or this object is not of type 'bool'.
+   *
+   * Deprecated. Use [toBoolValue].
    */
+  @deprecated
   bool get boolValue;
 
   /**
    * Return the floating point value of this object, or `null` if either the
    * value of this object is not known or this object is not of type 'double'.
+   *
+   * Deprecated. Use [toDoubleValue].
    */
+  @deprecated
   double get doubleValue;
 
   /**
    * Return `true` if this object's value can be represented exactly.
+   *
+   * Deprecated. The semantics of this method were not clear. One semantic is
+   * covered by [hasKnownValue].
    */
+  @deprecated
   bool get hasExactValue;
 
   /**
+   * Return `true` if the value of the object being represented is known.
+   *
+   * This method will return `false` if
+   * * the value being represented is the value of a declared variable (a
+   *   variable whose value is provided at run-time using a `-D` command-line
+   *   option), or
+   * * the value is a function.
+   *
+   * The result of this method does not imply anything about the state of
+   * object representations returned by the method [getField], those that are
+   * elements of the list returned by [toListValue], or the keys or values in
+   * the map returned by [toMapValue]. For example, a representation of a list
+   * can return `true` even if one or more of the elements of that list would
+   * return `false`.
+   */
+  bool get hasKnownValue;
+
+  /**
    * Return the integer value of this object, or `null` if either the value of
    * this object is not known or this object is not of type 'int'.
+   *
+   * Deprecated. Use [toIntValue].
    */
+  @deprecated
   int get intValue;
 
   /**
    * Return `true` if this object represents the value 'false'.
+   *
+   * Deprecated. Use `object.toBoolValue() == false`.
    */
+  @deprecated
   bool get isFalse;
 
   /**
-   * Return `true` if this object represents the value 'null'.
+   * Return `true` if the object being represented represents the value 'null'.
    */
   bool get isNull;
 
   /**
    * Return `true` if this object represents the value 'true'.
+   *
+   * Deprecated. Use `object.toBoolValue() == true`.
    */
+  @deprecated
   bool get isTrue;
 
   /**
    * Return the string value of this object, or `null` if either the value of
    * this object is not known or this object is not of type 'String'.
+   *
+   * Deprecated. Use [toStringValue].
    */
+  @deprecated
   String get stringValue;
 
   /**
-   * Return the run-time type of this object.
+   * Return a representation of the type of the object being represented.
+   *
+   * For values resulting from the invocation of a 'const' constructor, this
+   * will be a representation of the run-time type of the object.
+   *
+   * For values resulting from a literal expression, this will be a
+   * representation of the static type of the value -- `int` for integer
+   * literals, `List` for list literals, etc. -- even when the static type is an
+   * abstract type (such as `List`) and hence will never be the run-time type of
+   * the represented object.
+   *
+   * For values resulting from any other kind of expression, this will be a
+   * representation of the result of evaluating the expression.
+   *
+   * Return `null` if the expression cannot be evaluated, either because it is
+   * not a valid constant expression or because one or more of the values used
+   * in the expression does not have a known value.
+   *
+   * This method can return a representation of the type, even if this object
+   * would return `false` from [hasKnownValue].
    */
   ParameterizedType get type;
 
   /**
    * Return this object's value if it can be represented exactly, or `null` if
    * either the value cannot be represented exactly or if the value is `null`.
-   * Clients should use [hasExactValue] to distinguish between these two cases.
+   * Clients should use `hasExactValue` to distinguish between these two cases.
+   *
+   * Deprecated. Use one of the `isXValue()` methods.
    */
+  @deprecated
   Object get value;
+
+  /**
+   * Return a representation of the value of the field with the given [name].
+   *
+   * Return `null` if either the object being represented does not have a field
+   * with the given name or if the implementation of the class of the object is
+   * invalid, making it impossible to determine that value of the field.
+   *
+   * Note that, unlike the mirrors API, this method does *not* invoke a getter;
+   * it simply returns a representation of the known state of a field.
+   */
+  DartObject getField(String name);
+
+  /**
+   * Return a boolean corresponding to the value of the object being
+   * represented, or `null` if
+   * * this object is not of type 'bool',
+   * * the value of the object being represented is not known, or
+   * * the value of the object being represented is `null`.
+   */
+  bool toBoolValue();
+
+  /**
+   * Return a double corresponding to the value of the object being represented,
+   * or `null`
+   * if
+   * * this object is not of type 'double',
+   * * the value of the object being represented is not known, or
+   * * the value of the object being represented is `null`.
+   */
+  double toDoubleValue();
+
+  /**
+   * Return an integer corresponding to the value of the object being
+   * represented, or `null` if
+   * * this object is not of type 'int',
+   * * the value of the object being represented is not known, or
+   * * the value of the object being represented is `null`.
+   */
+  int toIntValue();
+
+  /**
+   * Return a list corresponding to the value of the object being represented,
+   * or `null` if
+   * * this object is not of type 'List', or
+   * * the value of the object being represented is `null`.
+   */
+  List<DartObject> toListValue();
+
+  /**
+   * Return a map corresponding to the value of the object being represented, or
+   * `null` if
+   * * this object is not of type 'Map', or
+   * * the value of the object being represented is `null`.
+   */
+  Map<DartObject, DartObject> toMapValue();
+
+  /**
+   * Return a string corresponding to the value of the object being represented,
+   * or `null` if
+   * * this object is not of type 'String',
+   * * the value of the object being represented is not known, or
+   * * the value of the object being represented is `null`.
+   */
+  String toStringValue();
+
+  /**
+   * Return a string corresponding to the value of the object being represented,
+   * or `null` if
+   * * this object is not of type 'Symbol', or
+   * * the value of the object being represented is `null`.
+   * (We return the string
+   */
+  String toSymbolValue();
+
+  /**
+   * Return the representation of the type corresponding to the value of the
+   * object being represented, or `null` if
+   * * this object is not of type 'Type', or
+   * * the value of the object being represented is `null`.
+   */
+  ParameterizedType toTypeValue();
 }
 
 /**
@@ -2399,24 +2558,17 @@
     return new DartObjectImpl(type, GenericState.UNKNOWN_VALUE);
   }
 
+  @deprecated
   @override
-  bool get boolValue {
-    if (_state is BoolState) {
-      return (_state as BoolState).value;
-    }
-    return null;
-  }
+  bool get boolValue => toBoolValue();
 
+  @deprecated
   @override
-  double get doubleValue {
-    if (_state is DoubleState) {
-      return (_state as DoubleState).value;
-    }
-    return null;
-  }
+  double get doubleValue => toDoubleValue();
 
   HashMap<String, DartObjectImpl> get fields => _state.fields;
 
+  @deprecated
   @override
   bool get hasExactValue => _state.hasExactValue;
 
@@ -2424,12 +2576,11 @@
   int get hashCode => JenkinsSmiHash.hash2(type.hashCode, _state.hashCode);
 
   @override
-  int get intValue {
-    if (_state is IntState) {
-      return (_state as IntState).value;
-    }
-    return null;
-  }
+  bool get hasKnownValue => !_state.isUnknown;
+
+  @deprecated
+  @override
+  int get intValue => toIntValue();
 
   /**
    * Return `true` if this object represents an object whose type is 'bool'.
@@ -2442,13 +2593,14 @@
    */
   bool get isBoolNumStringOrNull => _state.isBoolNumStringOrNull;
 
+  @deprecated
   @override
-  bool get isFalse =>
-      _state is BoolState && identical((_state as BoolState).value, false);
+  bool get isFalse => toBoolValue() == false;
 
   @override
   bool get isNull => _state is NullState;
 
+  @deprecated
   @override
   bool get isTrue =>
       _state is BoolState && identical((_state as BoolState).value, true);
@@ -2464,14 +2616,11 @@
    */
   bool get isUserDefinedObject => _state is GenericState;
 
+  @deprecated
   @override
-  String get stringValue {
-    if (_state is StringState) {
-      return (_state as StringState).value;
-    }
-    return null;
-  }
+  String get stringValue => toStringValue();
 
+  @deprecated
   @override
   Object get value => _state.value;
 
@@ -2633,6 +2782,14 @@
         typeProvider.boolType, _state.equalEqual(rightOperand._state));
   }
 
+  @override
+  DartObject getField(String name) {
+    if (_state is GenericState) {
+      return (_state as GenericState).fields[name];
+    }
+    return null;
+  }
+
   /**
    * Return the result of invoking the '&gt;' operator on this object with the
    * [rightOperand]. The [typeProvider] is the type provider used to find known
@@ -2906,7 +3063,77 @@
   }
 
   @override
+  bool toBoolValue() {
+    if (_state is BoolState) {
+      return (_state as BoolState).value;
+    }
+    return null;
+  }
+
+  @override
+  double toDoubleValue() {
+    if (_state is DoubleState) {
+      return (_state as DoubleState).value;
+    }
+    return null;
+  }
+
+  @override
+  int toIntValue() {
+    if (_state is IntState) {
+      return (_state as IntState).value;
+    }
+    return null;
+  }
+
+  @override
+  List<DartObject> toListValue() {
+    if (_state is ListState) {
+      return (_state as ListState)._elements;
+    }
+    return null;
+  }
+
+  @override
+  Map<DartObject, DartObject> toMapValue() {
+    if (_state is MapState) {
+      return (_state as MapState)._entries;
+    }
+    return null;
+  }
+
+  @override
   String toString() => "${type.displayName} ($_state)";
+
+  @override
+  String toStringValue() {
+    if (_state is StringState) {
+      return (_state as StringState).value;
+    }
+    return null;
+  }
+
+  @override
+  String toSymbolValue() {
+    if (_state is SymbolState) {
+      return (_state as SymbolState).value;
+    }
+    return null;
+  }
+
+  @override
+  ParameterizedType toTypeValue() {
+    if (_state is TypeState) {
+      Element element = (_state as TypeState).value;
+      if (element is ClassElement) {
+        return element.type;
+      }
+      if (element is FunctionElement) {
+        return element.type;
+      }
+    }
+    return null;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 5979466..7085b8d 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -13,7 +13,7 @@
     show AnalysisTarget, ConstantEvaluationTarget;
 
 import 'ast.dart';
-import 'constant.dart' show EvaluationResultImpl;
+import 'constant.dart' show DartObject, EvaluationResultImpl;
 import 'engine.dart' show AnalysisContext, AnalysisEngine, AnalysisException;
 import 'html.dart' show XmlAttributeNode, XmlTagNode;
 import 'java_core.dart';
@@ -1760,6 +1760,9 @@
   ConstFieldElementImpl.forNode(Identifier name) : super.forNode(name);
 
   @override
+  DartObject get constantValue => _result.value;
+
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
@@ -1791,6 +1794,9 @@
   ConstLocalVariableElementImpl.forNode(Identifier name) : super.forNode(name);
 
   @override
+  DartObject get constantValue => _result.value;
+
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
@@ -2109,6 +2115,9 @@
   ConstTopLevelVariableElementImpl(Identifier name) : super.forNode(name);
 
   @override
+  DartObject get constantValue => _result.value;
+
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
@@ -2273,6 +2282,9 @@
   DefaultFieldFormalParameterElementImpl(Identifier name) : super(name);
 
   @override
+  DartObject get constantValue => _result.value;
+
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
@@ -2297,6 +2309,9 @@
   DefaultParameterElementImpl(Identifier name) : super.forNode(name);
 
   @override
+  DartObject get constantValue => _result.value;
+
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
   @override
@@ -2659,6 +2674,14 @@
   static const List<ElementAnnotation> EMPTY_LIST = const <ElementAnnotation>[];
 
   /**
+   * Return a representation of the value of this annotation.
+   *
+   * Return `null` if the value of this annotation could not be computed because
+   * of errors.
+   */
+  DartObject get constantValue;
+
+  /**
    * Return the element representing the field, variable, or const constructor
    * being used as an annotation.
    */
@@ -2738,6 +2761,9 @@
   ElementAnnotationImpl(this.element);
 
   @override
+  DartObject get constantValue => evaluationResult.value;
+
+  @override
   bool get isDeprecated {
     if (element != null) {
       LibraryElement library = element.library;
@@ -10608,6 +10634,15 @@
   static const List<VariableElement> EMPTY_LIST = const <VariableElement>[];
 
   /**
+   * Return a representation of the value of this variable.
+   *
+   * Return `null` if either this variable was not declared with the 'const'
+   * modifier or if the value of this variable could not be computed because of
+   * errors.
+   */
+  DartObject get constantValue;
+
+  /**
    * Return `true` if this variable element did not have an explicit type
    * specified for it.
    */
@@ -10710,6 +10745,9 @@
     setModifier(Modifier.CONST, isConst);
   }
 
+  @override
+  DartObject get constantValue => null;
+
   /**
    * If this element represents a constant variable, and it has an initializer,
    * a copy of the initializer for the constant.  Otherwise `null`.
@@ -10814,6 +10852,9 @@
   VariableElement get baseElement => super.baseElement as VariableElement;
 
   @override
+  DartObject get constantValue => baseElement.constantValue;
+
+  @override
   bool get hasImplicitType => baseElement.hasImplicitType;
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 338a279..f496602 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -4,14 +4,15 @@
 
 library engine.element_handle;
 
-import 'ast.dart';
-import 'element.dart';
-import 'engine.dart';
-import 'java_core.dart';
-import 'java_engine.dart';
-import 'resolver.dart';
-import 'source.dart';
-import 'utilities_dart.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 
 /**
  * Instances of the class `ClassElementHandle` implement a handle to a `ClassElement`.
@@ -1092,6 +1093,9 @@
   VariableElement get actualElement => super.actualElement as VariableElement;
 
   @override
+  DartObject get constantValue => actualElement.constantValue;
+
+  @override
   bool get hasImplicitType => actualElement.hasImplicitType;
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 7ec28c5..5822a61 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer/task/model.dart' as newContext;
 import 'package:analyzer/task/model.dart';
 import 'package:html/dom.dart' show Document;
+import 'package:path/path.dart' as pathos;
 import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
 
@@ -590,6 +591,14 @@
       Source unitSource, Source librarySource);
 
   /**
+   * Return configuration data associated with the given key or `null` if no
+   * state has been associated with the given [key].
+   *
+   * See [setConfigurationData].
+   */
+  Object getConfigurationData(ResultDescriptor key);
+
+  /**
    * Return the contents and timestamp of the given [source].
    *
    * This method should be used rather than the method [Source.getContents]
@@ -886,6 +895,13 @@
       Source source, String contents, int offset, int oldLength, int newLength);
 
   /**
+   * Associate this configuration [data] object with the given descriptor [key].
+   *
+   * See [getConfigurationData].
+   */
+  void setConfigurationData(ResultDescriptor key, Object data);
+
+  /**
    * Set the contents of the given [source] to the given [contents] and mark the
    * source as having changed. This has the effect of overriding the default
    * contents of the source. If the contents are `null` the override is removed
@@ -938,6 +954,12 @@
   String name;
 
   /**
+   * Configuration data associated with this context.
+   */
+  final HashMap<ResultDescriptor, Object> _configurationData =
+      new HashMap<ResultDescriptor, Object>();
+
+  /**
    * The set of analysis options controlling the behavior of this context.
    */
   AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
@@ -1940,6 +1962,9 @@
   }
 
   @override
+  Object getConfigurationData(ResultDescriptor key) => _configurationData[key];
+
+  @override
   TimestampedData<String> getContents(Source source) {
     String contents = _contentCache.getContents(source);
     if (contents != null) {
@@ -2636,6 +2661,11 @@
   }
 
   @override
+  void setConfigurationData(ResultDescriptor key, Object data) {
+    _configurationData[key] = data;
+  }
+
+  @override
   void setContents(Source source, String contents) {
     _contentsChanged(source, contents, true);
   }
@@ -5846,6 +5876,11 @@
   static const String SUFFIX_HTML = "html";
 
   /**
+   * The file name used for analysis options files.
+   */
+  static const String ANALYSIS_OPTIONS_FILE = '.analysis_options';
+
+  /**
    * The unique instance of this class.
    */
   static final AnalysisEngine instance = new AnalysisEngine._();
@@ -5901,7 +5936,7 @@
    * A flag indicating whether the (new) task model should be used to perform
    * analysis.
    */
-  bool useTaskModel = false;
+  bool useTaskModel = true;
 
   /**
    * A flag indicating whether the task model should attempt to limit
@@ -6014,6 +6049,18 @@
   }
 
   /**
+   * Return `true` if the given [fileName] is an analysis options file.
+   */
+  static bool isAnalysisOptionsFileName(String fileName,
+      [pathos.Context context]) {
+    if (fileName == null) {
+      return false;
+    }
+    return (context ?? pathos.posix).basename(fileName) ==
+        ANALYSIS_OPTIONS_FILE;
+  }
+
+  /**
    * Return `true` if the given [fileName] is assumed to contain Dart source
    * code.
    */
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 4e56e10..af45572 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -6,6 +6,8 @@
 
 import 'dart:collection';
 
+import 'package:source_span/source_span.dart';
+
 import 'ast.dart' show AstNode;
 import 'element.dart';
 import 'java_core.dart';
@@ -294,6 +296,69 @@
 }
 
 /**
+ * The error codes used for errors in analysis options files. The convention for
+ * this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what is
+ * wrong and, when appropriate, how the problem can be corrected.
+ */
+class AnalysisOptionsErrorCode extends ErrorCode {
+  /**
+   * An error code indicating that there is a syntactic error in the file.
+   *
+   * Parameters:
+   * 0: the error message from the parse error
+   */
+  static const AnalysisOptionsErrorCode PARSE_ERROR =
+      const AnalysisOptionsErrorCode('PARSE_ERROR', '{0}');
+
+  /**
+   * Initialize a newly created error code to have the given [name].
+   */
+  const AnalysisOptionsErrorCode(String name, String message,
+      [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+}
+
+/**
+ * The error codes used for warnings in analysis options files. The convention
+ * for this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what is
+ * wrong and, when appropriate, how the problem can be corrected.
+ */
+class AnalysisOptionsWarningCode extends ErrorCode {
+  /**
+   * An error code indicating that a plugin is being configured with an
+   * unsupported option.
+   *
+   * Parameters:
+   * 0: the plugin name
+   * 1: the unsupported option key
+   */
+  static const AnalysisOptionsWarningCode UNSUPPORTED_OPTION =
+      const AnalysisOptionsWarningCode('UNSUPPORTED_OPTION_ERROR',
+          "The option '{1}' is not supported by {0}");
+
+  /**
+   * Initialize a newly created warning code to have the given [name].
+   */
+  const AnalysisOptionsWarningCode(String name, String message,
+      [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
+
+/**
  * An [AnalysisErrorListener] that keeps track of whether any error has been
  * reported to it.
  */
@@ -2606,6 +2671,15 @@
   }
 
   /**
+   * Report an error with the given [errorCode] and [arguments]. The location of
+   * the error is specified by the given [span].
+   */
+  void reportErrorForSpan(ErrorCode errorCode, SourceSpan span,
+      [List<Object> arguments]) {
+    reportErrorForOffset(errorCode, span.start.offset, span.length, arguments);
+  }
+
+  /**
    * Report an error with the given [errorCode] and [arguments]. The [token] is
    * used to compute the location of the error.
    */
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 7c8516e..ec9559a 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2157,7 +2157,7 @@
         overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(
             memberName, _currentLibrary);
       }
-      if (overriddenMember == null) {
+      if (overriddenMember == null && !_hasNoSuchMethod(_enclosingClass)) {
         _errorReporter.reportErrorForNode(
             StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
             nameNode,
@@ -4422,19 +4422,12 @@
       SimpleIdentifier classNameNode) {
     if (_enclosingClass.isAbstract) {
       return false;
+    } else if (_hasNoSuchMethod(_enclosingClass)) {
+      return false;
     }
     //
     // Store in local sets the set of all method and accessor names
     //
-    MethodElement method =
-        _enclosingClass.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME);
-    if (method != null) {
-      // If the enclosing class declares the method noSuchMethod(), then return.
-      // From Spec:  It is a static warning if a concrete class does not have an
-      // implementation for a method in any of its superinterfaces unless it
-      // declares its own noSuchMethod method (7.10).
-      return false;
-    }
     HashSet<ExecutableElement> missingOverrides =
         new HashSet<ExecutableElement>();
     //
@@ -5596,8 +5589,7 @@
     }
     // If there is a noSuchMethod method, then don't report the warning,
     // see dartbug.com/16078
-    if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) !=
-        null) {
+    if (_hasNoSuchMethod(classElement)) {
       return false;
     }
     ExecutableElement callMethod = _inheritanceManager.lookupMember(
@@ -5747,6 +5739,22 @@
   }
 
   /**
+   * Return `true` if the given [classElement] has a noSuchMethod() method
+   * distinct from the one declared in class Object, as per the Dart Language
+   * Specification (section 10.4).
+   */
+  bool _hasNoSuchMethod(ClassElement classElement) {
+    MethodElement method = classElement.lookUpMethod(
+        FunctionElement.NO_SUCH_METHOD_METHOD_NAME, classElement.library);
+    if (method == null) {
+      return false;
+    }
+    ClassElement definingClass =
+        method.getAncestor((Element element) => element is ClassElement);
+    return definingClass != null && !definingClass.type.isObject;
+  }
+
+  /**
    * Return `true` if the given [constructor] redirects to itself, directly or
    * indirectly.
    */
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 4a8dada..c15f247 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -901,11 +901,15 @@
         isByTask(BuildLibraryElementTask.DESCRIPTOR) ||
         isByTask(BuildPublicNamespaceTask.DESCRIPTOR) ||
         isByTask(BuildSourceExportClosureTask.DESCRIPTOR) ||
-        isByTask(BuildSourceImportExportClosureTask.DESCRIPTOR) ||
         isByTask(ComputeConstantDependenciesTask.DESCRIPTOR) ||
         isByTask(ComputeConstantValueTask.DESCRIPTOR) ||
         isByTask(ComputeLibraryCycleTask.DESCRIPTOR) ||
         isByTask(DartErrorsTask.DESCRIPTOR) ||
+        isByTask(ReadyLibraryElement2Task.DESCRIPTOR) ||
+        isByTask(ReadyLibraryElement5Task.DESCRIPTOR) ||
+        isByTask(ReadyResolvedUnitTask.DESCRIPTOR) ||
+        isByTask(ReadyResolvedUnit9Task.DESCRIPTOR) ||
+        isByTask(ReadyResolvedUnit10Task.DESCRIPTOR) ||
         isByTask(EvaluateUnitConstantsTask.DESCRIPTOR) ||
         isByTask(GenerateHintsTask.DESCRIPTOR) ||
         isByTask(InferInstanceMembersInUnitTask.DESCRIPTOR) ||
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 113da91..76f9dc7 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -4038,22 +4038,52 @@
         TokenType.INDEX
       ]);
     }
+    bool allowAdditionalTokens = true;
     // We know that we have an identifier, and need to see whether it might be
     // a type name.
+    if (_currentToken.type != TokenType.IDENTIFIER) {
+      allowAdditionalTokens = false;
+    }
     Token token = _skipTypeName(_currentToken);
     if (token == null) {
       // There was no type name, so this can't be a declaration.
       return false;
     }
+    if (token.type != TokenType.IDENTIFIER) {
+      allowAdditionalTokens = false;
+    }
     token = _skipSimpleIdentifier(token);
     if (token == null) {
       return false;
     }
     TokenType type = token.type;
-    return type == TokenType.EQ ||
+    // Usual cases in valid code:
+    //     String v = '';
+    //     String v, v2;
+    //     String v;
+    //     for (String item in items) {}
+    if (type == TokenType.EQ ||
         type == TokenType.COMMA ||
         type == TokenType.SEMICOLON ||
-        _tokenMatchesKeyword(token, Keyword.IN);
+        _tokenMatchesKeyword(token, Keyword.IN)) {
+      return true;
+    }
+    // It is OK to parse as a variable declaration in these cases:
+    //     String v }
+    //     String v if (true) print('OK');
+    //     String v { print(42); }
+    // ...but not in these cases:
+    //     get getterName {
+    //     String get getterName
+    if (allowAdditionalTokens) {
+      if (type == TokenType.CLOSE_CURLY_BRACKET ||
+          type == TokenType.KEYWORD ||
+          type == TokenType.IDENTIFIER ||
+          type == TokenType.OPEN_CURLY_BRACKET) {
+        return true;
+      }
+    }
+    return false;
   }
 
   bool _isLikelyParameterList() {
@@ -5829,12 +5859,12 @@
         _reportErrorForToken(
             ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword);
       }
-      Token leftSeparator = _expect(TokenType.SEMICOLON);
+      Token leftSeparator = _expectSemicolon();
       Expression condition = null;
       if (!_matches(TokenType.SEMICOLON)) {
         condition = parseExpression2();
       }
-      Token rightSeparator = _expect(TokenType.SEMICOLON);
+      Token rightSeparator = _expectSemicolon();
       List<Expression> updaters = null;
       if (!_matches(TokenType.CLOSE_PAREN)) {
         updaters = _parseExpressionList();
@@ -8281,8 +8311,7 @@
    */
   Token _skipSimpleIdentifier(Token startToken) {
     if (_tokenMatches(startToken, TokenType.IDENTIFIER) ||
-        (_tokenMatches(startToken, TokenType.KEYWORD) &&
-            (startToken as KeywordToken).keyword.isPseudoKeyword)) {
+        _tokenMatchesPseudoKeyword(startToken)) {
       return startToken.next;
     }
     return null;
@@ -8506,8 +8535,7 @@
    */
   bool _tokenMatchesIdentifier(Token token) =>
       _tokenMatches(token, TokenType.IDENTIFIER) ||
-          (_tokenMatches(token, TokenType.KEYWORD) &&
-              (token as KeywordToken).keyword.isPseudoKeyword);
+          _tokenMatchesPseudoKeyword(token);
 
   /**
    * Return `true` if the given [token] matches the given [keyword].
@@ -8517,6 +8545,13 @@
           (token as KeywordToken).keyword == keyword;
 
   /**
+   * Return `true` if the given [token] matches a pseudo keyword.
+   */
+  bool _tokenMatchesPseudoKeyword(Token token) =>
+      _tokenMatches(token, TokenType.KEYWORD) &&
+          (token as KeywordToken).keyword.isPseudoKeyword;
+
+  /**
    * Return `true` if the given [token] matches the given [identifier].
    */
   bool _tokenMatchesString(Token token, String identifier) =>
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index e52fd11..40a2162 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1521,14 +1521,14 @@
       if (!_isDebugConstant(lhsCondition)) {
         EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition);
         if (lhsResult != null) {
-          if (lhsResult.value.isTrue && isBarBar) {
+          if (lhsResult.value.toBoolValue() == true && isBarBar) {
             // report error on else block: true || !e!
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, node.rightOperand);
             // only visit the LHS:
             _safelyVisit(lhsCondition);
             return null;
-          } else if (lhsResult.value.isFalse && isAmpAmp) {
+          } else if (lhsResult.value.toBoolValue() == false && isAmpAmp) {
             // report error on if block: false && !e!
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, node.rightOperand);
@@ -1582,7 +1582,7 @@
       EvaluationResultImpl result =
           _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.isTrue) {
+        if (result.value.toBoolValue() == true) {
           // report error on else block: true ? 1 : !2!
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.elseExpression);
@@ -1608,7 +1608,7 @@
       EvaluationResultImpl result =
           _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.isTrue) {
+        if (result.value.toBoolValue() == true) {
           // report error on else block: if(true) {} else {!}
           Statement elseStatement = node.elseStatement;
           if (elseStatement != null) {
@@ -1717,7 +1717,7 @@
       EvaluationResultImpl result =
           _getConstantBooleanValue(conditionExpression);
       if (result != null) {
-        if (result.value.isFalse) {
+        if (result.value.toBoolValue() == false) {
           // report error on if block: while (false) {!}
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body);
           return null;
@@ -15724,11 +15724,6 @@
   }
 
   @override
-  Object visitTypeName(TypeName node) {
-    return null;
-  }
-
-  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     // Ignore if already resolved - declaration or type.
     if (node.inDeclarationContext()) {
@@ -15740,7 +15735,8 @@
       return null;
     } else if (parent is ConstructorDeclaration && parent.returnType == node) {
       return null;
-    } else if (parent is ConstructorFieldInitializer && parent.fieldName == node) {
+    } else if (parent is ConstructorFieldInitializer &&
+        parent.fieldName == node) {
       return null;
     }
     // Ignore if qualified.
@@ -15793,6 +15789,11 @@
     }
     return null;
   }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    return null;
+  }
 }
 
 class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 7362c4d..3f8c0ef 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -888,7 +888,7 @@
     } else if (staticElement is MethodElement) {
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
+      staticType = _getTypeOfProperty(staticElement);
       propagatedType =
           _getPropertyPropagatedType(staticElement, propagatedType);
     } else if (staticElement is ExecutableElement) {
@@ -921,8 +921,7 @@
     } else if (propagatedElement is MethodElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
-      propagatedType =
-          _getTypeOfProperty(propagatedElement, node.prefix.staticType);
+      propagatedType = _getTypeOfProperty(propagatedElement);
       propagatedType =
           _getPropertyPropagatedType(propagatedElement, propagatedType);
     } else if (propagatedElement is ExecutableElement) {
@@ -1024,9 +1023,7 @@
     if (staticElement is MethodElement) {
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
-      Expression realTarget = node.realTarget;
-      staticType = _getTypeOfProperty(staticElement,
-          realTarget != null ? _getStaticType(realTarget) : null);
+      staticType = _getTypeOfProperty(staticElement);
     } else {
       // TODO(brianwilkerson) Report this internal error.
     }
@@ -1040,8 +1037,7 @@
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
       Expression realTarget = node.realTarget;
-      propagatedType = _getTypeOfProperty(
-          propagatedElement, realTarget != null ? realTarget.bestType : null);
+      propagatedType = _getTypeOfProperty(propagatedElement);
     } else {
       // TODO(brianwilkerson) Report this internal error.
     }
@@ -1117,7 +1113,7 @@
     } else if (element is MethodElement) {
       staticType = element.type;
     } else if (element is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(element, null);
+      staticType = _getTypeOfProperty(element);
     } else if (element is ExecutableElement) {
       staticType = element.type;
     } else if (element is TypeParameterElement) {
@@ -1419,12 +1415,17 @@
   }
 
   // TODO(vsm): Use leafp's matchType here?
-  DartType _findIteratedType(InterfaceType type, DartType targetType) {
+  DartType _findIteratedType(DartType type, DartType targetType) {
     // Set by _find if match is found
     DartType result = null;
     // Elements we've already visited on a given inheritance path.
     HashSet<ClassElement> visitedClasses = null;
 
+    while (type is TypeParameterType) {
+      TypeParameterElement element = type.element;
+      type = element.bound;
+    }
+
     bool _find(InterfaceType type) {
       ClassElement element = type.element;
       if (type == _typeProvider.objectType || element == null) {
@@ -1451,7 +1452,9 @@
         visitedClasses.remove(element);
       }
     }
-    _find(type);
+    if (type is InterfaceType) {
+      _find(type);
+    }
     return result;
   }
 
@@ -1621,14 +1624,9 @@
    * Return the type that should be recorded for a node that resolved to the given accessor.
    *
    * @param accessor the accessor that the node resolved to
-   * @param context if the accessor element has context [by being the RHS of a
-   *          [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
-   *          accessor is a parameter type, then the type of the LHS can be used to get more
-   *          specific type information
    * @return the type that should be recorded for a node that resolved to the given accessor
    */
-  DartType _getTypeOfProperty(
-      PropertyAccessorElement accessor, DartType context) {
+  DartType _getTypeOfProperty(PropertyAccessorElement accessor) {
     FunctionType functionType = accessor.type;
     if (functionType == null) {
       // TODO(brianwilkerson) Report this internal error. This happens when we
@@ -1651,29 +1649,7 @@
       }
       return _dynamicType;
     }
-    DartType returnType = functionType.returnType;
-    if (returnType is TypeParameterType && context is InterfaceType) {
-      // if the return type is a TypeParameter, we try to use the context [that
-      // the function is being called on] to get a more accurate returnType type
-      InterfaceType interfaceTypeContext = context;
-      //      Type[] argumentTypes = interfaceTypeContext.getTypeArguments();
-      List<TypeParameterElement> typeParameterElements =
-          interfaceTypeContext.element != null
-              ? interfaceTypeContext.element.typeParameters
-              : null;
-      if (typeParameterElements != null) {
-        for (int i = 0; i < typeParameterElements.length; i++) {
-          TypeParameterElement typeParameterElement = typeParameterElements[i];
-          if (returnType.name == typeParameterElement.name) {
-            return interfaceTypeContext.typeArguments[i];
-          }
-        }
-        // TODO(jwren) troubleshoot why call to substitute doesn't work
-//        Type[] parameterTypes = TypeParameterTypeImpl.getTypes(parameterElements);
-//        return returnType.substitute(argumentTypes, parameterTypes);
-      }
-    }
-    return returnType;
+    return functionType.returnType;
   }
 
   /**
@@ -1691,15 +1667,13 @@
         Expression expr = loop.iterable;
         LocalVariableElementImpl element = loopVariable.element;
         DartType exprType = expr.staticType;
-        if (exprType is InterfaceType) {
-          DartType targetType = (loop.awaitKeyword == null)
-              ? _typeProvider.iterableType
-              : _typeProvider.streamType;
-          DartType iteratedType = _findIteratedType(exprType, targetType);
-          if (element != null && iteratedType != null) {
-            element.type = iteratedType;
-            loopVariable.identifier.staticType = iteratedType;
-          }
+        DartType targetType = (loop.awaitKeyword == null)
+            ? _typeProvider.iterableType
+            : _typeProvider.streamType;
+        DartType iteratedType = _findIteratedType(exprType, targetType);
+        if (element != null && iteratedType != null) {
+          element.type = iteratedType;
+          loopVariable.identifier.staticType = iteratedType;
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index d120a81..d000b54 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -4,6 +4,7 @@
 
 library engine.utilities.general;
 
+import 'dart:collection';
 import 'dart:developer' show UserTag;
 
 /**
@@ -32,6 +33,26 @@
 }
 
 /**
+ * A simple limited queue.
+ */
+class LimitedQueue<E> extends ListQueue<E> {
+  final int limit;
+
+  /**
+   * Create a queue with [limit] items.
+   */
+  LimitedQueue(this.limit);
+
+  @override
+  void add(E o) {
+    super.add(o);
+    while (length > limit) {
+      remove(first);
+    }
+  }
+}
+
+/**
  * Helper class for gathering performance statistics.  This class is modeled on
  * the UserTag class in dart:developer so that it can interoperate easily with
  * it.
diff --git a/pkg/analyzer/lib/src/plugin/engine_plugin.dart b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
index a53deb8..a067dcc 100644
--- a/pkg/analyzer/lib/src/plugin/engine_plugin.dart
+++ b/pkg/analyzer/lib/src/plugin/engine_plugin.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/task/general.dart';
 import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/src/task/html_work_manager.dart';
+import 'package:analyzer/src/task/options_work_manager.dart';
 import 'package:analyzer/task/model.dart';
 import 'package:plugin/plugin.dart';
 
@@ -190,7 +191,6 @@
     registerExtension(taskId, BuildLibraryElementTask.DESCRIPTOR);
     registerExtension(taskId, BuildPublicNamespaceTask.DESCRIPTOR);
     registerExtension(taskId, BuildSourceExportClosureTask.DESCRIPTOR);
-    registerExtension(taskId, BuildSourceImportExportClosureTask.DESCRIPTOR);
     registerExtension(taskId, BuildTypeProviderTask.DESCRIPTOR);
     registerExtension(taskId, ComputeConstantDependenciesTask.DESCRIPTOR);
     registerExtension(taskId, ComputeConstantValueTask.DESCRIPTOR);
@@ -211,6 +211,11 @@
     registerExtension(taskId, LibraryUnitErrorsTask.DESCRIPTOR);
     registerExtension(taskId, ParseDartTask.DESCRIPTOR);
     registerExtension(taskId, PartiallyResolveUnitReferencesTask.DESCRIPTOR);
+    registerExtension(taskId, ReadyLibraryElement2Task.DESCRIPTOR);
+    registerExtension(taskId, ReadyLibraryElement5Task.DESCRIPTOR);
+    registerExtension(taskId, ReadyResolvedUnitTask.DESCRIPTOR);
+    registerExtension(taskId, ReadyResolvedUnit9Task.DESCRIPTOR);
+    registerExtension(taskId, ReadyResolvedUnit10Task.DESCRIPTOR);
     registerExtension(taskId, ResolveInstanceFieldsInUnitTask.DESCRIPTOR);
     registerExtension(taskId, ResolveLibraryReferencesTask.DESCRIPTOR);
     registerExtension(taskId, ResolveLibraryTypeNamesTask.DESCRIPTOR);
@@ -235,6 +240,8 @@
         (InternalAnalysisContext context) => new DartWorkManager(context));
     registerExtension(taskId,
         (InternalAnalysisContext context) => new HtmlWorkManager(context));
+    registerExtension(taskId,
+        (InternalAnalysisContext context) => new OptionsWorkManager(context));
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/plugin/options_plugin.dart b/pkg/analyzer/lib/src/plugin/options_plugin.dart
index fc82910..6e0ebd6 100644
--- a/pkg/analyzer/lib/src/plugin/options_plugin.dart
+++ b/pkg/analyzer/lib/src/plugin/options_plugin.dart
@@ -5,6 +5,8 @@
 library analyzer.src.plugin.options;
 
 import 'package:analyzer/plugin/options.dart';
+import 'package:analyzer/plugin/task.dart';
+import 'package:analyzer/src/task/options.dart';
 import 'package:plugin/plugin.dart';
 
 /// A plugin that defines the extension points and extensions that are defined
@@ -15,15 +17,28 @@
   /// register new options processors.
   static const String OPTIONS_PROCESSOR_EXTENSION_POINT = 'optionsProcessor';
 
+  /// The simple identifier of the extension point that allows plugins to
+  /// register new options validators.
+  static const String OPTIONS_VALIDATOR_EXTENSION_POINT = 'optionsValidator';
+
   /// The unique identifier of this plugin.
   static const String UNIQUE_IDENTIFIER = 'options.core';
 
-  /// The extension point that allows plugins to register new options processors.
+  /// The extension point that allows plugins to register new options
+  /// processors.
   ExtensionPoint optionsProcessorExtensionPoint;
 
+  /// The extension point that allows plugins to register new options
+  /// validators.
+  ExtensionPoint optionsValidatorExtensionPoint;
+
   /// All contributed options processors.
   List<OptionsProcessor> get optionsProcessors =>
-      optionsProcessorExtensionPoint.extensions;
+      optionsProcessorExtensionPoint?.extensions ?? const [];
+
+  /// All contributed options validators.
+  List<OptionsValidator> get optionsValidators =>
+      optionsValidatorExtensionPoint?.extensions ?? const [];
 
   @override
   String get uniqueIdentifier => UNIQUE_IDENTIFIER;
@@ -32,19 +47,35 @@
   void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
     optionsProcessorExtensionPoint = registerExtensionPoint(
         OPTIONS_PROCESSOR_EXTENSION_POINT, _validateOptionsProcessorExtension);
+    optionsValidatorExtensionPoint = registerExtensionPoint(
+        OPTIONS_VALIDATOR_EXTENSION_POINT, _validateOptionsValidatorExtension);
   }
 
   @override
   void registerExtensions(RegisterExtension registerExtension) {
-    // There are no default extensions.
+    // Analyze options files.
+    registerExtension(
+        TASK_EXTENSION_POINT_ID, GenerateOptionsErrorsTask.DESCRIPTOR);
+    // Validate analyzer analysis options.
+    registerExtension(
+        OPTIONS_VALIDATOR_EXTENSION_POINT_ID, new AnalyzerOptionsValidator());
   }
 
-  /// Validate the given extension by throwing an [ExtensionError] if it is not a
-  /// valid options processor.
+  /// Validate the given extension by throwing an [ExtensionError] if it is not
+  /// a valid options processor.
   void _validateOptionsProcessorExtension(Object extension) {
     if (extension is! OptionsProcessor) {
       String id = optionsProcessorExtensionPoint.uniqueIdentifier;
       throw new ExtensionError('Extensions to $id must be an OptionsProcessor');
     }
   }
+
+  /// Validate the given extension by throwing an [ExtensionError] if it is not
+  /// a valid options validator.
+  void _validateOptionsValidatorExtension(Object extension) {
+    if (extension is! OptionsValidator) {
+      String id = optionsValidatorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError('Extensions to $id must be an OptionsValidator');
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/services/lint.dart b/pkg/analyzer/lib/src/services/lint.dart
index 5efc3ea..a6b55cc 100644
--- a/pkg/analyzer/lib/src/services/lint.dart
+++ b/pkg/analyzer/lib/src/services/lint.dart
@@ -9,11 +9,25 @@
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/visitors.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/task/model.dart';
 
-/// A registry containing mappings of contexts to their associated configured
-/// lints.
-final Map<AnalysisContext, List<Linter>> lintRegistry =
-    <AnalysisContext, List<Linter>>{};
+const List<Linter> _noLints = const <Linter>[];
+
+/// The descriptor used to associate lints with analysis contexts in
+/// configuration data.
+final ResultDescriptor<List<Linter>> CONFIGURED_LINTS_KEY =
+    new ResultDescriptorImpl('configured.lints', _noLints);
+
+/// Return lints associated with this [context], or an empty list if there are
+/// none.
+List<Linter> getLints(AnalysisContext context) =>
+    context.getConfigurationData(CONFIGURED_LINTS_KEY) ?? _noLints;
+
+/// Associate these [lints] with the given [context].
+void setLints(AnalysisContext context, List<Linter> lints) {
+  context.setConfigurationData(CONFIGURED_LINTS_KEY, lints);
+}
 
 /// Implementers contribute lint warnings via the provided error [reporter].
 abstract class Linter {
@@ -32,9 +46,7 @@
 ///
 /// See [LintCode].
 class LintGenerator {
-  /// A global container for contributed linters.
-  @deprecated // Use lintRegistry.
-  static final List<Linter> LINTERS = <Linter>[];
+  static const List<Linter> _noLints = const <Linter>[];
 
   final Iterable<CompilationUnit> _compilationUnits;
   final AnalysisErrorListener _errorListener;
@@ -42,7 +54,7 @@
 
   LintGenerator(this._compilationUnits, this._errorListener,
       [Iterable<Linter> linters])
-      : _linters = linters ?? LINTERS;
+      : _linters = linters ?? _noLints;
 
   void generate() {
     PerformanceStatistics.lint.makeCurrentWhile(() {
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index aff5bca..f45c923 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -153,15 +153,6 @@
         'HINT_ERRORS', AnalysisError.NO_ERRORS);
 
 /**
- * The sources representing the combined import/export closure of a library.
- * The [Source]s include only library sources, not their units.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE =
-    new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null);
-
-/**
  * A list of the [VariableElement]s whose type should be inferred that another
  * inferable static variable (the target) depends on.
  *
@@ -186,7 +177,7 @@
         'INFERABLE_STATIC_VARIABLES_IN_UNIT', null);
 
 /**
- * An inferrable static variable ([VariableElement]) whose type has been
+ * An inferable static variable ([VariableElement]) whose type has been
  * inferred.
  *
  * The result is only available for [VariableElement]s, and only when strong
@@ -304,6 +295,18 @@
     new ResultDescriptor<bool>('LIBRARY_ERRORS_READY', false);
 
 /**
+ * The [LibrarySpecificUnit]s that a library consists of.
+ *
+ * The list will include the defining unit and units for [INCLUDED_PARTS].
+ * So, it is never empty or `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<LibrarySpecificUnit> LIBRARY_SPECIFIC_UNITS =
+    new ListResultDescriptor<LibrarySpecificUnit>(
+        'LIBRARY_SPECIFIC_UNITS', LibrarySpecificUnit.EMPTY_LIST);
+
+/**
  * The analysis errors associated with a compilation unit in a specific library.
  *
  * The result is only available for [LibrarySpecificUnit]s.
@@ -335,6 +338,51 @@
         'PARSE_ERRORS', AnalysisError.NO_ERRORS);
 
 /**
+ * The flag specifying that [LIBRARY_ELEMENT2] is ready for a library and its
+ * import/export closure.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> READY_LIBRARY_ELEMENT2 =
+    new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT2', false);
+
+/**
+ * The flag specifying that [LIBRARY_ELEMENT5] is ready for a library and its
+ * import/export closure.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> READY_LIBRARY_ELEMENT5 =
+    new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT5', false);
+
+/**
+ * The flag specifying that [RESOLVED_UNIT] is ready for all of the units of a
+ * library and its import/export closure.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> READY_RESOLVED_UNIT =
+    new ResultDescriptor<bool>('READY_RESOLVED_UNIT', false);
+
+/**
+ * The flag specifying that [RESOLVED_UNIT10] is ready for all of the units of a
+ * library and its import/export closure.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> READY_RESOLVED_UNIT10 =
+    new ResultDescriptor<bool>('READY_RESOLVED_UNIT10', false);
+
+/**
+ * The flag specifying that [RESOLVED_UNIT9] is ready for all of the units of a
+ * library and its import/export closure.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> READY_RESOLVED_UNIT9 =
+    new ResultDescriptor<bool>('READY_RESOLVED_UNIT9', false);
+
+/**
  * The names (resolved and not) referenced by a unit.
  *
  * The result is only available for [Source]s representing a compilation unit.
@@ -1427,66 +1475,6 @@
 }
 
 /**
- * A task that builds [IMPORT_EXPORT_SOURCE_CLOSURE] of a library, and also
- * sets [IS_CLIENT].
- */
-class BuildSourceImportExportClosureTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the import/export closure.
-   */
-  static const String IMPORT_EXPORT_INPUT = 'IMPORT_EXPORT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildSourceImportExportClosureTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[IMPORT_EXPORT_SOURCE_CLOSURE, IS_CLIENT]);
-
-  BuildSourceImportExportClosureTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    List<Source> importExportClosure = getRequiredInput(IMPORT_EXPORT_INPUT);
-    Source htmlSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
-    //
-    // Record outputs.
-    //
-    outputs[IMPORT_EXPORT_SOURCE_CLOSURE] = importExportClosure;
-    outputs[IS_CLIENT] = importExportClosure.contains(htmlSource);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given library [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      IMPORT_EXPORT_INPUT:
-          new _ImportExportSourceClosureTaskInput(source, LIBRARY_ELEMENT2)
-    };
-  }
-
-  /**
-   * Create a [BuildSourceImportExportClosureTask] based on the given [target]
-   * in the given [context].
-   */
-  static BuildSourceImportExportClosureTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildSourceImportExportClosureTask(context, target);
-  }
-}
-
-/**
  * A task that builds [TYPE_PROVIDER] for a context.
  */
 class BuildTypeProviderTask extends SourceBasedAnalysisTask {
@@ -1556,11 +1544,6 @@
  */
 class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask {
   /**
-   * The name of the [RESOLVED_UNIT9] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
    * The name of the [TYPE_PROVIDER] input.
    */
   static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
@@ -1583,10 +1566,6 @@
     //
     // Prepare inputs.
     //
-    // Note: UNIT_INPUT is not needed.  It is merely a bookkeeping dependency
-    // to ensure that resolution has occurred before we attempt to determine
-    // constant dependencies.
-    //
     ConstantEvaluationTarget constant = target;
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
     //
@@ -1608,23 +1587,32 @@
    * given [target].
    */
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    //
+    // TODO(brianwilkerson) I believe that this does not properly guarantee that
+    // all of the constructor initializers that we might encounter have been
+    // copied into the element model. We tried forcing the computation of the
+    // RESOLVED_UNIT9 for each unit reachable from the target's library, but
+    // that had too big a performance impact. We could potentially mitigate the
+    // impact by computing a more accurate list of the sources containing
+    // constructors that are actually referenced, but other approaches should
+    // be considered.
+    //
+    Source librarySource;
     if (target is Element) {
       CompilationUnitElementImpl unit = target
           .getAncestor((Element element) => element is CompilationUnitElement);
-      return <String, TaskInput>{
-        UNIT_INPUT: RESOLVED_UNIT9
-            .of(new LibrarySpecificUnit(unit.librarySource, target.source)),
-        TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-      };
+      librarySource = unit.librarySource;
     } else if (target is ConstantEvaluationTarget_Annotation) {
-      return <String, TaskInput>{
-        UNIT_INPUT: RESOLVED_UNIT9
-            .of(new LibrarySpecificUnit(target.librarySource, target.source)),
-        TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-      };
+      librarySource = target.librarySource;
+    } else {
+      throw new AnalysisException(
+          'Cannot build inputs for a ${target.runtimeType}');
     }
-    throw new AnalysisException(
-        'Cannot build inputs for a ${target.runtimeType}');
+    return <String, TaskInput>{
+      'resolvedUnit': RESOLVED_UNIT9
+          .of(new LibrarySpecificUnit(librarySource, target.source)),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
   }
 
   /**
@@ -1907,10 +1895,8 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     LibrarySpecificUnit unit = target;
     return <String, TaskInput>{
-      'resolveReachableLibraries': IMPORT_EXPORT_SOURCE_CLOSURE
-          .of(unit.library)
-          .toListOf(LIBRARY_ELEMENT2),
-      LIBRARY_ELEMENT_INPUT: LIBRARY_ELEMENT2.of(unit.library)
+      LIBRARY_ELEMENT_INPUT: LIBRARY_ELEMENT2.of(unit.library),
+      'resolveReachableLibraries': READY_LIBRARY_ELEMENT2.of(unit.library),
     };
   }
 
@@ -2578,14 +2564,10 @@
     Source libSource = unit.library;
     return <String, TaskInput>{
       RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(unit),
-      USED_LOCAL_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) {
-        LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit);
-        return USED_LOCAL_ELEMENTS.of(target);
-      }),
-      USED_IMPORTED_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) {
-        LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit);
-        return USED_IMPORTED_ELEMENTS.of(target);
-      }),
+      USED_LOCAL_ELEMENTS_INPUT:
+          LIBRARY_SPECIFIC_UNITS.of(libSource).toListOf(USED_LOCAL_ELEMENTS),
+      USED_IMPORTED_ELEMENTS_INPUT:
+          LIBRARY_SPECIFIC_UNITS.of(libSource).toListOf(USED_IMPORTED_ELEMENTS),
       TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
     };
   }
@@ -2642,7 +2624,7 @@
     //
     // Generate lints.
     //
-    List<Linter> linters = lintRegistry[context] ?? [];
+    List<Linter> linters = getLints(context);
     linters.forEach((l) => l.reporter = errorReporter);
     Iterable<AstVisitor> visitors = linters.map((l) => l.getVisitor()).toList();
     unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null)));
@@ -2672,7 +2654,7 @@
 }
 
 /**
- * A task that ensures that all of the inferrable instance members in a
+ * A task that ensures that all of the inferable instance members in a
  * compilation unit have had their type inferred.
  */
 class InferInstanceMembersInUnitTask extends SourceBasedAnalysisTask {
@@ -2792,7 +2774,7 @@
 }
 
 /**
- * A task that ensures that all of the inferrable static variables in a
+ * A task that ensures that all of the inferable static variables in a
  * compilation unit have had their type inferred.
  */
 class InferStaticVariableTypesInUnitTask extends SourceBasedAnalysisTask {
@@ -2803,7 +2785,7 @@
   static const String UNIT_INPUT = 'UNIT_INPUT';
 
   /**
-   * The name of the input whose value is a list of the inferrable static
+   * The name of the input whose value is a list of the inferable static
    * variables whose types have been computed.
    */
   static const String INFERRED_VARIABLES_INPUT = 'INFERRED_VARIABLES_INPUT';
@@ -2868,7 +2850,7 @@
 }
 
 /**
- * A task that computes the type of an inferrable static variable and
+ * A task that computes the type of an inferable static variable and
  * stores it in the element model.
  */
 class InferStaticVariableTypeTask extends InferStaticVariableTask {
@@ -3032,7 +3014,7 @@
   /**
    * Return a map from the names of the inputs of this kind of task to the task
    * input descriptors describing those inputs for a task with the
-   * given [library].
+   * given [target].
    */
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     Source source = target;
@@ -3211,6 +3193,7 @@
     EXPORTED_LIBRARIES,
     IMPORTED_LIBRARIES,
     INCLUDED_PARTS,
+    LIBRARY_SPECIFIC_UNITS,
     PARSE_ERRORS,
     PARSED_UNIT,
     SOURCE_KIND,
@@ -3297,10 +3280,13 @@
     List<AnalysisError> parseErrors =
         removeDuplicateErrors(errorListener.errors);
     List<Source> unitSources = <Source>[source]..addAll(includedSourceSet);
+    List<LibrarySpecificUnit> librarySpecificUnits =
+        unitSources.map((s) => new LibrarySpecificUnit(source, s)).toList();
     outputs[EXPLICITLY_IMPORTED_LIBRARIES] = explicitlyImportedSources;
     outputs[EXPORTED_LIBRARIES] = exportedSources;
     outputs[IMPORTED_LIBRARIES] = importedSources;
     outputs[INCLUDED_PARTS] = includedSources;
+    outputs[LIBRARY_SPECIFIC_UNITS] = librarySpecificUnits;
     outputs[PARSE_ERRORS] = parseErrors;
     outputs[PARSED_UNIT] = unit;
     outputs[SOURCE_KIND] = sourceKind;
@@ -3442,9 +3428,7 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     LibrarySpecificUnit unit = target;
     return <String, TaskInput>{
-      'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE
-          .of(unit.library)
-          .toListOf(LIBRARY_ELEMENT5),
+      'fullyBuiltLibraryElements': READY_LIBRARY_ELEMENT5.of(unit.library),
       LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
       UNIT_INPUT: RESOLVED_UNIT4.of(unit),
       TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
@@ -3509,6 +3493,222 @@
 }
 
 /**
+ * A task that ensures that [LIBRARY_ELEMENT2] is ready for the target library
+ * source and its import/export closure.
+ */
+class ReadyLibraryElement2Task extends SourceBasedAnalysisTask {
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ReadyLibraryElement2Task',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[READY_LIBRARY_ELEMENT2]);
+
+  ReadyLibraryElement2Task(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    outputs[READY_LIBRARY_ELEMENT2] = true;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'thisLibraryElementReady': LIBRARY_ELEMENT2.of(source),
+      'directlyImportedLibrariesReady':
+          IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2),
+      'directlyExportedLibrariesReady':
+          EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2),
+    };
+  }
+
+  static ReadyLibraryElement2Task createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ReadyLibraryElement2Task(context, target);
+  }
+}
+
+/**
+ * A task that ensures that [LIBRARY_ELEMENT5] is ready for the target library
+ * source and its import/export closure.
+ */
+class ReadyLibraryElement5Task extends SourceBasedAnalysisTask {
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ReadyLibraryElement5Task',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[READY_LIBRARY_ELEMENT5]);
+
+  ReadyLibraryElement5Task(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    outputs[READY_LIBRARY_ELEMENT5] = true;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'thisLibraryElementReady': LIBRARY_ELEMENT5.of(source),
+      'directlyImportedLibrariesReady':
+          IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT5),
+      'directlyExportedLibrariesReady':
+          EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT5),
+    };
+  }
+
+  static ReadyLibraryElement5Task createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ReadyLibraryElement5Task(context, target);
+  }
+}
+
+/**
+ * A task that ensures that [RESOLVED_UNIT10] is ready for every unit of the
+ * target library source and its import/export closure.
+ */
+class ReadyResolvedUnit10Task extends SourceBasedAnalysisTask {
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ReadyResolvedUnit10Task',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[READY_RESOLVED_UNIT10]);
+
+  ReadyResolvedUnit10Task(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    outputs[READY_RESOLVED_UNIT10] = true;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'thisLibraryUnitsReady':
+          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT10),
+      'directlyImportedLibrariesReady':
+          IMPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT10),
+      'directlyExportedLibrariesReady':
+          EXPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT10),
+    };
+  }
+
+  static ReadyResolvedUnit10Task createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ReadyResolvedUnit10Task(context, target);
+  }
+}
+
+/**
+ * A task that ensures that [RESOLVED_UNIT9] is ready for every unit of the
+ * target library source and its import/export closure.
+ */
+class ReadyResolvedUnit9Task extends SourceBasedAnalysisTask {
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ReadyResolvedUnit9Task',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[READY_RESOLVED_UNIT9]);
+
+  ReadyResolvedUnit9Task(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    outputs[READY_RESOLVED_UNIT9] = true;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'thisLibraryUnitsReady':
+          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT9),
+      'directlyImportedLibrariesReady':
+          IMPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT9),
+      'directlyExportedLibrariesReady':
+          EXPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT9),
+    };
+  }
+
+  static ReadyResolvedUnit9Task createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ReadyResolvedUnit9Task(context, target);
+  }
+}
+
+/**
+ * A task that ensures that [RESOLVED_UNIT] is ready for every unit of the
+ * target library source and its import/export closure.
+ */
+class ReadyResolvedUnitTask extends SourceBasedAnalysisTask {
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ReadyResolvedUnitTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[READY_RESOLVED_UNIT]);
+
+  ReadyResolvedUnitTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    outputs[READY_RESOLVED_UNIT] = true;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'thisLibraryUnitsReady':
+          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT),
+      'directlyImportedLibrariesReady':
+          IMPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT),
+      'directlyExportedLibrariesReady':
+          EXPORTED_LIBRARIES.of(source).toListOf(READY_RESOLVED_UNIT),
+    };
+  }
+
+  static ReadyResolvedUnitTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ReadyResolvedUnitTask(context, target);
+  }
+}
+
+/**
  * Information about a library - which names it uses, which names it defines
  * with their externally visible dependencies.
  */
@@ -3607,7 +3807,7 @@
 }
 
 /**
- * A task that ensures that all of the inferrable instance members in a
+ * A task that ensures that all of the inferable instance members in a
  * compilation unit have had their right hand sides re-resolved
  */
 class ResolveInstanceFieldsInUnitTask extends SourceBasedAnalysisTask {
@@ -3723,7 +3923,7 @@
 }
 
 /**
- * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] for every
+ * A task that finishes resolution by requesting [RESOLVED_UNIT9] for every
  * unit in the libraries closure and produces [LIBRARY_ELEMENT].
  */
 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask {
@@ -3781,13 +3981,8 @@
     Source source = target;
     return <String, TaskInput>{
       LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source),
-      UNITS_INPUT: UNITS.of(source).toList((Source unit) =>
-          RESOLVED_UNIT9.of(new LibrarySpecificUnit(source, unit))),
-      'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
-          .of(source)
-          .toMapOf(UNITS)
-          .toFlattenList((Source library, Source unit) =>
-              RESOLVED_UNIT9.of(new LibrarySpecificUnit(library, unit))),
+      UNITS_INPUT: LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT9),
+      'thisLibraryClosureIsReady': READY_RESOLVED_UNIT9.of(source),
     };
   }
 
@@ -3802,7 +3997,7 @@
 }
 
 /**
- * An artifitial task that does nothing except to force type names resolution
+ * An artificial task that does nothing except to force type names resolution
  * for the defining and part units of a library.
  */
 class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask {
@@ -3857,8 +4052,8 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     Source source = target;
     return <String, TaskInput>{
-      'resolvedUnit': UNITS.of(source).toList((Source unit) =>
-          RESOLVED_UNIT3.of(new LibrarySpecificUnit(source, unit))),
+      'resolvedUnit':
+          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT3),
       LIBRARY_INPUT: LIBRARY_ELEMENT4.of(source),
       TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
     };
@@ -3926,6 +4121,10 @@
     //
     // Record outputs.
     //
+    // TODO(brianwilkerson) This task modifies the element model (by copying the
+    // AST's for constructor initializers into it) but does not produce an
+    // updated version of the element model.
+    //
     outputs[RESOLVE_UNIT_ERRORS] = errorListener.errors;
     outputs[RESOLVED_UNIT9] = unit;
   }
@@ -4306,13 +4505,9 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     LibrarySpecificUnit unit = target;
     return <String, TaskInput>{
-      'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
-          .of(unit.library)
-          .toMapOf(UNITS)
-          .toFlattenList((Source library, Source unit) =>
-              RESOLVED_UNIT10.of(new LibrarySpecificUnit(library, unit))),
       UNIT_INPUT: RESOLVED_UNIT10.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
+      'thisLibraryClosureIsReady': READY_RESOLVED_UNIT10.of(unit.library),
     };
   }
 
@@ -4437,11 +4632,7 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     LibrarySpecificUnit unit = target;
     return <String, TaskInput>{
-      'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
-          .of(unit.library)
-          .toMapOf(UNITS)
-          .toFlattenList((Source library, Source unit) =>
-              RESOLVED_UNIT.of(new LibrarySpecificUnit(library, unit))),
+      'thisLibraryClosureIsReady': READY_RESOLVED_UNIT.of(unit.library),
       UNIT_INPUT: RESOLVED_UNIT.of(unit),
       TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
     };
@@ -4477,25 +4668,6 @@
 }
 
 /**
- * A [TaskInput] whose value is a list of library sources imported or exported,
- * directly or indirectly by the target [Source].
- *
- * [resultDescriptor] is the type of result which should be produced for each
- * target [Source].
- */
-class _ImportExportSourceClosureTaskInput extends TaskInputImpl<List<Source>> {
-  final Source target;
-  final ResultDescriptor resultDescriptor;
-
-  _ImportExportSourceClosureTaskInput(this.target, this.resultDescriptor);
-
-  @override
-  TaskInputBuilder<List<Source>> createBuilder() =>
-      new _SourceClosureTaskInputBuilder(
-          target, _SourceClosureKind.IMPORT_EXPORT, resultDescriptor);
-}
-
-/**
  * A [TaskInput] whose value is a list of library sources imported directly
  * or indirectly by the target [Source].
  *
diff --git a/pkg/analyzer/lib/src/task/driver.dart b/pkg/analyzer/lib/src/task/driver.dart
index b725042..c6abda8 100644
--- a/pkg/analyzer/lib/src/task/driver.dart
+++ b/pkg/analyzer/lib/src/task/driver.dart
@@ -17,7 +17,10 @@
 import 'package:analyzer/src/task/manager.dart';
 import 'package:analyzer/task/model.dart';
 
-final PerformanceTag workOrderMoveNextPerfTag =
+final PerformanceTag analysisDriverProcessOutputs =
+    new PerformanceTag('AnalysisDriver.processOutputs');
+
+final PerformanceTag workOrderMoveNextPerformanceTag =
     new PerformanceTag('WorkOrder.moveNext');
 
 /**
@@ -266,31 +269,33 @@
     AnalysisTask task = item.buildTask();
     _onTaskStartedController.add(task);
     task.perform();
-    AnalysisTarget target = task.target;
-    CacheEntry entry = context.getCacheEntry(target);
-    if (task.caughtException == null) {
-      List<TargetedResult> dependedOn = item.inputTargetedResults.toList();
-      Map<ResultDescriptor, dynamic> outputs = task.outputs;
-      for (ResultDescriptor result in task.descriptor.results) {
-        // TODO(brianwilkerson) We could check here that a value was produced
-        // and throw an exception if not (unless we want to allow null values).
-        entry.setValue(result, outputs[result], dependedOn);
-      }
-      outputs.forEach((ResultDescriptor descriptor, value) {
-        StreamController<ComputedResult> controller =
-            resultComputedControllers[descriptor];
-        if (controller != null) {
-          ComputedResult event =
-              new ComputedResult(context, descriptor, target, value);
-          controller.add(event);
+    analysisDriverProcessOutputs.makeCurrentWhile(() {
+      AnalysisTarget target = task.target;
+      CacheEntry entry = context.getCacheEntry(target);
+      if (task.caughtException == null) {
+        List<TargetedResult> dependedOn = item.inputTargetedResults.toList();
+        Map<ResultDescriptor, dynamic> outputs = task.outputs;
+        for (ResultDescriptor result in task.descriptor.results) {
+          // TODO(brianwilkerson) We could check here that a value was produced
+          // and throw an exception if not (unless we want to allow null values).
+          entry.setValue(result, outputs[result], dependedOn);
         }
-      });
-      for (WorkManager manager in workManagers) {
-        manager.resultsComputed(target, outputs);
+        outputs.forEach((ResultDescriptor descriptor, value) {
+          StreamController<ComputedResult> controller =
+              resultComputedControllers[descriptor];
+          if (controller != null) {
+            ComputedResult event =
+                new ComputedResult(context, descriptor, target, value);
+            controller.add(event);
+          }
+        });
+        for (WorkManager manager in workManagers) {
+          manager.resultsComputed(target, outputs);
+        }
+      } else {
+        entry.setErrorState(task.caughtException, item.descriptor.results);
       }
-    } else {
-      entry.setErrorState(task.caughtException, item.descriptor.results);
-    }
+    });
     _onTaskCompletedController.add(task);
     return task;
   }
@@ -520,11 +525,26 @@
 }
 
 /**
- * A description of a single anaysis task that can be performed to advance
+ * A description of a single analysis task that can be performed to advance
  * analysis.
  */
 class WorkItem {
   /**
+   * A table mapping the names of analysis tasks to the number of times each
+   * kind of task has been performed.
+   */
+  static final Map<TaskDescriptor, int> countMap =
+      new HashMap<TaskDescriptor, int>();
+
+  /**
+   * A table mapping the names of analysis tasks to stopwatches used to compute
+   * how much time was spent between creating an item and creating (for
+   * performing) of each kind of task
+   */
+  static final Map<TaskDescriptor, Stopwatch> stopwatchMap =
+      new HashMap<TaskDescriptor, Stopwatch>();
+
+  /**
    * The context in which the task will be performed.
    */
   final InternalAnalysisContext context;
@@ -545,6 +565,11 @@
   final ResultDescriptor spawningResult;
 
   /**
+   * The current inputs computing stopwatch.
+   */
+  Stopwatch stopwatch;
+
+  /**
    * An iterator used to iterate over the descriptors of the inputs to the task,
    * or `null` if all of the inputs have been collected and the task can be
    * created.
@@ -594,6 +619,19 @@
       builder = null;
     }
     inputs = new HashMap<String, dynamic>();
+    // Update performance counters.
+    {
+      stopwatch = stopwatchMap[descriptor];
+      if (stopwatch == null) {
+        stopwatch = new Stopwatch();
+        stopwatchMap[descriptor] = stopwatch;
+      }
+      stopwatch.start();
+    }
+    {
+      int count = countMap[descriptor];
+      countMap[descriptor] = count == null ? 1 : count + 1;
+    }
   }
 
   @override
@@ -613,6 +651,7 @@
    * Build the task represented by this work item.
    */
   AnalysisTask buildTask() {
+    stopwatch.stop();
     if (builder != null) {
       throw new StateError("some inputs have not been computed");
     }
@@ -728,9 +767,11 @@
     }
   }
 
+  List<WorkItem> get workItems => _dependencyWalker._path;
+
   @override
   bool moveNext() {
-    return workOrderMoveNextPerfTag.makeCurrentWhile(() {
+    return workOrderMoveNextPerformanceTag.makeCurrentWhile(() {
       if (currentItems != null && currentItems.length > 1) {
         // Yield more items.
         currentItems.removeLast();
@@ -759,7 +800,7 @@
 }
 
 /**
- * Specilaization of [CycleAwareDependencyWalker] for use by [WorkOrder].
+ * Specialization of [CycleAwareDependencyWalker] for use by [WorkOrder].
  */
 class _WorkOrderDependencyWalker extends CycleAwareDependencyWalker<WorkItem> {
   /**
diff --git a/pkg/analyzer/lib/src/task/inputs.dart b/pkg/analyzer/lib/src/task/inputs.dart
index 468f313..2236ca0 100644
--- a/pkg/analyzer/lib/src/task/inputs.dart
+++ b/pkg/analyzer/lib/src/task/inputs.dart
@@ -88,12 +88,19 @@
  * A mixin-ready implementation of [ListTaskInput].
  */
 abstract class ListTaskInputMixin<E> implements ListTaskInput<E> {
+  @override
+  ListTaskInput /*<V>*/ toFlattenListOf(
+      ListResultDescriptor /*<V>*/ subListResult) {
+    return new ListToFlattenListTaskInput<E, dynamic /*V*/ >(
+        this, subListResult.of as dynamic);
+  }
+
   ListTaskInput /*<V>*/ toList(UnaryFunction<E, dynamic /*<V>*/ > mapper) {
     return new ListToListTaskInput<E, dynamic /*V*/ >(this, mapper);
   }
 
   ListTaskInput /*<V>*/ toListOf(ResultDescriptor /*<V>*/ valueResult) {
-    return (this as ListTaskInputImpl<AnalysisTarget>).toList(valueResult.of);
+    return (this as ListTaskInput<AnalysisTarget>).toList(valueResult.of);
   }
 
   MapTaskInput<E, dynamic /*V*/ > toMap(
@@ -114,6 +121,60 @@
  * input. Finally, each of the task inputs are used to access analysis results,
  * and the list of the analysis results is used as the input to the task.
  */
+class ListToFlattenListTaskInput<B, E>
+    extends _ListToCollectionTaskInput<B, E, List<E>>
+    with ListTaskInputMixin<E>
+    implements ListTaskInput<E> {
+  /**
+   * Initialize a result accessor to use the given [baseAccessor] to access a
+   * list of values that can be passed to the given [generateTaskInputs] to
+   * generate a list of task inputs that can be used to access the elements of
+   * the input being accessed.
+   */
+  ListToFlattenListTaskInput(TaskInput<List<B>> baseAccessor,
+      GenerateTaskInputs<B, E> generateTaskInputs)
+      : super(baseAccessor, generateTaskInputs);
+
+  @override
+  TaskInputBuilder<List<E>> createBuilder() =>
+      new ListToFlattenListTaskInputBuilder<B, E>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [ListToFlattenListTaskInput].
+ */
+class ListToFlattenListTaskInputBuilder<B, E>
+    extends _ListToCollectionTaskInputBuilder<B, E, List<E>> {
+  /**
+   * The list of values being built.
+   */
+  List<E> _resultValue;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  ListToFlattenListTaskInputBuilder(ListToFlattenListTaskInput<B, E> input)
+      : super(input);
+
+  @override
+  void _addResultElement(B baseElement, E resultElement) {
+    _resultValue.addAll(resultElement as Iterable);
+  }
+
+  @override
+  void _initResultValue() {
+    _resultValue = <E>[];
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by the following steps. First
+ * another (base) task input is used to compute a [List]-valued result. An input
+ * generator function is then used to map each element of that list to a task
+ * input. Finally, each of the task inputs are used to access analysis results,
+ * and the list of the analysis results is used as the input to the task.
+ */
 class ListToListTaskInput<B, E>
     extends _ListToCollectionTaskInput<B, E, List<E>>
     with ListTaskInputMixin<E> {
@@ -379,6 +440,13 @@
       new ObjectToListTaskInputBuilder<E>(this);
 
   @override
+  ListTaskInput /*<V>*/ toFlattenListOf(
+      ListResultDescriptor /*<V>*/ subListResult) {
+    return new ListToFlattenListTaskInput<E, dynamic /*V*/ >(
+        this, subListResult.of as dynamic);
+  }
+
+  @override
   ListTaskInput /*<V>*/ toListOf(ResultDescriptor /*<V>*/ valueResult) {
     return new ListToListTaskInput<E, dynamic /*V*/ >(
         this, valueResult.of as dynamic);
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
new file mode 100644
index 0000000..9f22f7f
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2015, the Dart 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.
+
+library analyzer.src.task.options;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/plugin/options.dart';
+import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/general.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:source_span/source_span.dart';
+import 'package:yaml/yaml.dart';
+
+/// The errors produced while parsing `.analysis_options` files.
+///
+/// The list will be empty if there were no errors, but will not be `null`.
+final ListResultDescriptor<AnalysisError> ANALYSIS_OPTIONS_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'ANALYSIS_OPTIONS_ERRORS', AnalysisError.NO_ERRORS);
+
+/// Validates `analyzer` top-level options.
+class AnalyzerOptionsValidator extends TopLevelOptionValidator {
+  AnalyzerOptionsValidator()
+      : super('analyzer', const ['exclude', 'plugins', 'strong-mode']);
+}
+
+/// Convenience class for composing validators.
+class CompositeValidator extends OptionsValidator {
+  final List<OptionsValidator> validators;
+  CompositeValidator(this.validators);
+
+  @override
+  void validate(ErrorReporter reporter, Map<String, YamlNode> options) =>
+      validators.forEach((v) => v.validate(reporter, options));
+}
+
+/// A task that generates errors for an `.analysis_options` file.
+class GenerateOptionsErrorsTask extends SourceBasedAnalysisTask {
+  /// The name of the input whose value is the content of the file.
+  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
+
+  /// The task descriptor describing this kind of task.
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'GenerateOptionsErrorsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[ANALYSIS_OPTIONS_ERRORS, LINE_INFO]);
+
+  final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
+
+  GenerateOptionsErrorsTask(AnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  Source get source => target.source;
+
+  @override
+  void internalPerform() {
+    String content = getRequiredInput(CONTENT_INPUT_NAME);
+
+    List<AnalysisError> errors = <AnalysisError>[];
+
+    try {
+      Map<String, YamlNode> options =
+          optionsProvider.getOptionsFromString(content);
+      errors.addAll(_validate(options));
+    } on OptionsFormatException catch (e) {
+      SourceSpan span = e.span;
+      var error = new AnalysisError(source, span.start.column + 1, span.length,
+          AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]);
+      errors.add(error);
+    }
+
+    //
+    // Record outputs.
+    //
+    outputs[ANALYSIS_OPTIONS_ERRORS] = errors;
+    outputs[LINE_INFO] = _computeLineInfo(content);
+  }
+
+  List<AnalysisError> _validate(Map<String, YamlNode> options) =>
+      new OptionsFileValidator(source).validate(options);
+
+  /// Return a map from the names of the inputs of this kind of task to the
+  /// task input descriptors describing those inputs for a task with the
+  /// given [target].
+  static Map<String, TaskInput> buildInputs(Source source) =>
+      <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(source)};
+
+  /// Create a task based on the given [target] in the given [context].
+  static GenerateOptionsErrorsTask createTask(
+          AnalysisContext context, AnalysisTarget target) =>
+      new GenerateOptionsErrorsTask(context, target);
+
+  /// Compute [LineInfo] for the given [content].
+  static LineInfo _computeLineInfo(String content) {
+    List<int> lineStarts = <int>[0];
+    for (int index = 0; index < content.length; index++) {
+      if (content.codeUnitAt(index) == 0x0A) {
+        lineStarts.add(index + 1);
+      }
+    }
+    return new LineInfo(lineStarts);
+  }
+}
+
+/// Validates `linter` top-level options.
+/// TODO(pq): move into `linter` package and plugin.
+class LinterOptionsValidator extends TopLevelOptionValidator {
+  LinterOptionsValidator() : super('linter', const ['rules']);
+}
+
+/// Validates options defined in an `.analysis_options` file.
+class OptionsFileValidator {
+  // TODO(pq): move to an extension point.
+  final List<OptionsValidator> _validators = [
+    new AnalyzerOptionsValidator(),
+    new LinterOptionsValidator()
+  ];
+
+  final Source source;
+  OptionsFileValidator(this.source) {
+    _validators.addAll(AnalysisEngine.instance.optionsPlugin.optionsValidators);
+  }
+
+  List<AnalysisError> validate(Map<String, YamlNode> options) {
+    RecordingErrorListener recorder = new RecordingErrorListener();
+    ErrorReporter reporter = new ErrorReporter(recorder, source);
+    _validators.forEach((OptionsValidator v) => v.validate(reporter, options));
+    return recorder.errors;
+  }
+}
+
+/// Validates top-level options. For example,
+///     plugin:
+///       top-level-option: true
+class TopLevelOptionValidator extends OptionsValidator {
+  final String pluginName;
+  final List<String> supportedOptions;
+
+  TopLevelOptionValidator(this.pluginName, this.supportedOptions);
+  @override
+  void validate(ErrorReporter reporter, Map<String, YamlNode> options) {
+    YamlNode node = options[pluginName];
+    if (node is YamlMap) {
+      node.nodes.forEach((k, v) {
+        if (k is YamlScalar) {
+          if (!supportedOptions.contains(k.value)) {
+            reporter.reportErrorForSpan(
+                AnalysisOptionsWarningCode.UNSUPPORTED_OPTION,
+                k.span,
+                [pluginName, k.value]);
+          }
+        }
+        //TODO(pq): consider an error if the node is not a Scalar.
+      });
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/task/options_work_manager.dart b/pkg/analyzer/lib/src/task/options_work_manager.dart
new file mode 100644
index 0000000..4447f30
--- /dev/null
+++ b/pkg/analyzer/lib/src/task/options_work_manager.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2015, the Dart 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.
+
+library analyzer.src.task.options_work_manager;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        AnalysisOptions,
+        CacheState,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/task/model.dart';
+
+/// The manager for `.analysis_options` specific analysis.
+class OptionsWorkManager implements WorkManager {
+  /// The context for which work is being managed.
+  final InternalAnalysisContext context;
+
+  /// The options file sources.
+  final LinkedHashSet<Source> sourceQueue = new LinkedHashSet<Source>();
+
+  /// The [TargetedResult]s that should be computed with priority.
+  final LinkedHashSet<TargetedResult> priorityResultQueue =
+      new LinkedHashSet<TargetedResult>();
+
+  /// Initialize a newly created manager.
+  OptionsWorkManager(this.context) {
+    analysisCache.onResultInvalidated.listen(onResultInvalidated);
+  }
+
+  /// Returns the correctly typed result of `context.analysisCache`.
+  AnalysisCache get analysisCache => context.analysisCache;
+
+  /// Specifies that the client wants the given [result] of the given [target]
+  /// to be computed with priority.
+  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
+    priorityResultQueue.add(new TargetedResult(target, result));
+  }
+
+  @override
+  void applyChange(List<Source> addedSources, List<Source> changedSources,
+      List<Source> removedSources) {
+    addedSources = addedSources.where(_isOptionsSource).toList();
+    changedSources = changedSources.where(_isOptionsSource).toList();
+    removedSources = removedSources.where(_isOptionsSource).toList();
+    // source queue
+    sourceQueue.addAll(addedSources);
+    sourceQueue.addAll(changedSources);
+    sourceQueue.removeAll(removedSources);
+  }
+
+  @override
+  void applyPriorityTargets(List<AnalysisTarget> targets) {
+    // Unschedule the old targets.
+    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
+    for (TargetedResult result in priorityResultQueue) {
+      if (result.result == ANALYSIS_OPTIONS_ERRORS) {
+        resultsToUnschedule.add(result);
+      }
+    }
+    priorityResultQueue.removeAll(resultsToUnschedule);
+    // Schedule new targets.
+    for (AnalysisTarget target in targets) {
+      if (_isOptionsSource(target)) {
+        addPriorityResult(target, ANALYSIS_OPTIONS_ERRORS);
+      }
+    }
+  }
+
+  @override
+  List<AnalysisError> getErrors(Source source) {
+    if (!_isOptionsSource(source)) {
+      return AnalysisError.NO_ERRORS;
+    }
+    // If analysis is finished, use all the errors.
+    if (analysisCache.getState(source, ANALYSIS_OPTIONS_ERRORS) ==
+        CacheState.VALID) {
+      return analysisCache.getValue(source, ANALYSIS_OPTIONS_ERRORS);
+    }
+    // No partial results.
+    return AnalysisError.NO_ERRORS;
+  }
+
+  @override
+  TargetedResult getNextResult() {
+    // Try to find a priority result to compute.
+    while (priorityResultQueue.isNotEmpty) {
+      TargetedResult result = priorityResultQueue.first;
+      if (!_needsComputing(result.target, result.result)) {
+        priorityResultQueue.remove(result);
+        continue;
+      }
+      return result;
+    }
+    // Try to find a new options file to analyze.
+    while (sourceQueue.isNotEmpty) {
+      Source optionsSource = sourceQueue.first;
+      if (!_needsComputing(optionsSource, ANALYSIS_OPTIONS_ERRORS)) {
+        sourceQueue.remove(optionsSource);
+        continue;
+      }
+      return new TargetedResult(optionsSource, ANALYSIS_OPTIONS_ERRORS);
+    }
+    // No results to compute.
+    return null;
+  }
+
+  @override
+  WorkOrderPriority getNextResultPriority() {
+    if (priorityResultQueue.isNotEmpty) {
+      return WorkOrderPriority.PRIORITY;
+    }
+    if (sourceQueue.isNotEmpty) {
+      return WorkOrderPriority.NORMAL;
+    }
+    return WorkOrderPriority.NONE;
+  }
+
+  @override
+  void onAnalysisOptionsChanged() {
+    // Do nothing.
+  }
+
+  /// Notifies the manager that a result has been invalidated.
+  void onResultInvalidated(InvalidatedResult event) {
+    ResultDescriptor descriptor = event.descriptor;
+    if (descriptor == ANALYSIS_OPTIONS_ERRORS) {
+      sourceQueue.add(event.entry.target);
+    }
+  }
+
+  @override
+  void onSourceFactoryChanged() {
+    // Do nothing.
+  }
+
+  @override
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
+    // Update notice.
+    if (_isOptionsSource(target)) {
+      bool shouldSetErrors = false;
+      outputs.forEach((ResultDescriptor descriptor, value) {
+        if (descriptor == ANALYSIS_OPTIONS_ERRORS) {
+          shouldSetErrors = true;
+        }
+      });
+      if (shouldSetErrors) {
+        AnalysisErrorInfo info = context.getErrors(target);
+        context.getNotice(target).setErrors(info.errors, info.lineInfo);
+      }
+    }
+  }
+
+  /// Returns `true` if the given [result] of the given [target] needs
+  /// computing, i.e. it is not in the valid and not in the error state.
+  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
+    CacheState state = analysisCache.getState(target, result);
+    return state != CacheState.VALID && state != CacheState.ERROR;
+  }
+
+  /// Return `true` if the given target is an `.analysis_options` source.
+  static bool _isOptionsSource(AnalysisTarget target) => target is Source &&
+      AnalysisEngine.isAnalysisOptionsFileName(target.fullName);
+}
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index d1ebb6b..9cfefe8 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -563,9 +563,7 @@
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     var element = node.staticElement;
-    if (element == null) {
-      _recordMessage(new MissingTypeError(node));
-    } else {
+    if (element != null) {
       var type = node.staticElement.type;
       checkArgumentList(node.argumentList, type);
     }
@@ -663,8 +661,6 @@
     if (element != null) {
       var type = rules.elementType(node.staticElement);
       checkArgumentList(arguments, type);
-    } else {
-      _recordMessage(new MissingTypeError(node));
     }
     node.visitChildren(this);
   }
@@ -920,11 +916,7 @@
   }
 
   DartType _getStaticType(Expression expr) {
-    var type = expr.staticType;
-    if (type == null) {
-      reporter.onError(new MissingTypeError(expr).toAnalysisError());
-    }
-    return type ?? rules.provider.dynamicType;
+    return expr.staticType ?? rules.provider.dynamicType;
   }
 
   void _recordDynamicInvoke(AstNode node, AstNode target) {
diff --git a/pkg/analyzer/lib/src/task/strong/info.dart b/pkg/analyzer/lib/src/task/strong/info.dart
index 1f7caf6..1aa42b2 100644
--- a/pkg/analyzer/lib/src/task/strong/info.dart
+++ b/pkg/analyzer/lib/src/task/strong/info.dart
@@ -154,11 +154,28 @@
       return new StaticTypeError(rules, expression, toT, reason: reason);
     }
 
+    // TODO(vsm): Change this to an assert when we have generic methods and
+    // fix TypeRules._coerceTo to disallow implicit sideways casts.
+    if (!rules.isSubTypeOf(toT, fromT)) {
+      assert(toT.isSubtypeOf(fromT) || fromT.isAssignableTo(toT));
+      return new DownCastComposite(rules, expression, cast);
+    }
+
     // Composite cast: these are more likely to fail.
     if (!rules.isGroundType(toT)) {
       // This cast is (probably) due to our different treatment of dynamic.
       // It may be more likely to fail at runtime.
-      return new DownCastComposite(rules, expression, cast);
+      if (fromT is InterfaceType) {
+        // For class types, we'd like to allow non-generic down casts, e.g.,
+        // Iterable<T> to List<T>.  The intuition here is that raw (generic)
+        // casts are problematic, and we should complain about those.
+        var typeArgs = fromT.typeArguments;
+        if (typeArgs.isEmpty || typeArgs.any((t) => t.isDynamic)) {
+          return new DownCastComposite(rules, expression, cast);
+        }
+      } else {
+        return new DownCastComposite(rules, expression, cast);
+      }
     }
 
     // Dynamic cast
@@ -435,20 +452,6 @@
   String get message => _messageHelper('Invalid override');
 }
 
-/// Used to mark unexpected situations in our compiler were we couldn't compute
-/// the type of an expression.
-// TODO(sigmund): This is normally a result of another error that is caught by
-// the analyzer, so this should likely be removed in the future.
-class MissingTypeError extends StaticInfo {
-  final AstNode node;
-  toErrorCode() => new StaticTypeWarningCode(name, message);
-
-  MissingTypeError(this.node);
-
-  @override List<Object> get arguments => [node, node.runtimeType];
-  String get message => "type analysis didn't compute the type of: {0} {1}";
-}
-
 /// Dart constructors have one weird quirk, illustrated with this example:
 ///
 ///     class Base {
diff --git a/pkg/analyzer/lib/src/task/strong/rules.dart b/pkg/analyzer/lib/src/task/strong/rules.dart
index b575dbf..3cd6db2 100644
--- a/pkg/analyzer/lib/src/task/strong/rules.dart
+++ b/pkg/analyzer/lib/src/task/strong/rules.dart
@@ -376,8 +376,6 @@
 
   // Produce a coercion which coerces something of type fromT
   // to something of type toT.
-  // If wrap is true and both are function types, a closure
-  // wrapper coercion is produced using _wrapTo (see above)
   // Returns the error coercion if the types cannot be coerced
   // according to our current criteria.
   Coercion _coerceTo(DartType fromT, DartType toT) {
@@ -387,11 +385,12 @@
     // fromT <: toT, no coercion needed
     if (isSubTypeOf(fromT, toT)) return Coercion.identity(toT);
 
-    // For now, reject conversions between function types and
-    // call method objects.  We could choose to allow casts here.
-    // Wrapping a function type to assign it to a call method
-    // object will never succeed.  Wrapping the other way could
-    // be allowed.
+    // TODO(vsm): We can get rid of the second clause if we disallow
+    // all sideways casts - see TODO below.
+    // -------
+    // Note: a function type is never assignable to a class per the Dart
+    // spec - even if it has a compatible call method.  We disallow as
+    // well for consistency.
     if ((fromT is FunctionType && getCallMethodType(toT) != null) ||
         (toT is FunctionType && getCallMethodType(fromT) != null)) {
       return Coercion.error();
@@ -400,6 +399,10 @@
     // Downcast if toT <: fromT
     if (isSubTypeOf(toT, fromT)) return Coercion.cast(fromT, toT);
 
+    // TODO(vsm): Once we have generic methods, we should delete this
+    // workaround.  These sideways casts are always ones we warn about
+    // - i.e., we think they are likely to fail at runtime.
+    // -------
     // Downcast if toT <===> fromT
     // The intention here is to allow casts that are sideways in the restricted
     // type system, but allowed in the regular dart type system, since these
@@ -409,6 +412,7 @@
     if (fromT.isAssignableTo(toT)) {
       return Coercion.cast(fromT, toT);
     }
+
     return Coercion.error();
   }
 
diff --git a/pkg/analyzer/lib/task/dart.dart b/pkg/analyzer/lib/task/dart.dart
index 644ab24..45fcb56 100644
--- a/pkg/analyzer/lib/task/dart.dart
+++ b/pkg/analyzer/lib/task/dart.dart
@@ -68,15 +68,6 @@
     new ListResultDescriptor<Source>('INCLUDED_PARTS', Source.EMPTY_LIST);
 
 /**
- * A flag specifying whether a library is dependent on code that is only
- * available in a client.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> IS_CLIENT =
-    new ResultDescriptor<bool>('IS_CLIENT', false);
-
-/**
  * A flag specifying whether a library is launchable.
  *
  * The result is only available for [Source]s representing a library.
@@ -151,6 +142,9 @@
  * change if a single part is included in more than one library.
  */
 class LibrarySpecificUnit implements AnalysisTarget {
+  static const List<LibrarySpecificUnit> EMPTY_LIST =
+      const <LibrarySpecificUnit>[];
+
   /**
    * The defining compilation unit of the library in which the [unit]
    * is analyzed.
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
index cf3cce8..f550495 100644
--- a/pkg/analyzer/lib/task/model.dart
+++ b/pkg/analyzer/lib/task/model.dart
@@ -59,7 +59,7 @@
 /**
  * An object with which an analysis result can be associated.
  *
- * Clients are allowed to subtype this class when creating new kinds of targets.
+ * Clients may implement this class when creating new kinds of targets.
  * Instances of this type are used in hashed data structures, so subtypes are
  * required to correctly implement [==] and [hashCode].
  */
@@ -75,10 +75,15 @@
  * An object used to compute one or more analysis results associated with a
  * single target.
  *
- * Clients are expected to extend this class when creating new tasks.
+ * Clients must extend this class when creating new tasks.
  */
 abstract class AnalysisTask {
   /**
+   * A queue storing the last 10 task descriptions for diagnostic purposes.
+   */
+  static final LimitedQueue<String> LAST_TASKS = new LimitedQueue<String>(10);
+
+  /**
    * A table mapping the types of analysis tasks to the number of times each
    * kind of task has been performed.
    */
@@ -198,7 +203,7 @@
    * map should be fully populated (have a key/value pair for each result that
    * this task is expected to produce) or the [caughtException] should be set.
    *
-   * Clients should not override this method.
+   * Clients may not override this method.
    */
   void perform() {
     try {
@@ -261,11 +266,16 @@
    * Perform this analysis task, ensuring that all exceptions are wrapped in an
    * [AnalysisException].
    *
-   * Clients should not override this method.
+   * Clients may not override this method.
    */
   void _safelyPerform() {
     try {
       //
+      // Store task description for diagnostics.
+      //
+      LAST_TASKS.add(description);
+
+      //
       // Report that this task is being performed.
       //
       String contextName = context.name;
@@ -318,7 +328,7 @@
  * A description of a [List]-based analysis result that can be computed by an
  * [AnalysisTask].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class ListResultDescriptor<E> implements ResultDescriptor<List<E>> {
   /**
@@ -338,10 +348,17 @@
  * A description of an input to an [AnalysisTask] that can be used to compute
  * that input.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class ListTaskInput<E> extends TaskInput<List<E>> {
   /**
+   * Return a task input that can be used to compute a flatten list whose
+   * elements are combined [subListResult]'s associated with those elements.
+   */
+  ListTaskInput /*<V>*/ toFlattenListOf(
+      ListResultDescriptor /*<V>*/ subListResult);
+
+  /**
    * Return a task input that can be used to compute a list whose elements are
    * the result of passing the elements of this input to the [mapper] function.
    */
@@ -373,7 +390,7 @@
 /**
  * A description of an input with a [Map] based values.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class MapTaskInput<K, V> extends TaskInput<Map<K, V>> {
   /**
@@ -392,6 +409,8 @@
  *
  * All the [ResultDescriptor]s with the same [ResultCachingPolicy] instance
  * share the same total size in a cache.
+ *
+ * Clients may implement this class when implementing plugins.
  */
 abstract class ResultCachingPolicy<T> {
   /**
@@ -415,7 +434,7 @@
 /**
  * A description of an analysis result that can be computed by an [AnalysisTask].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class ResultDescriptor<V> {
   /**
@@ -455,7 +474,7 @@
 /**
  * A specification of the given [result] for the given [target].
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 class TargetedResult {
   /**
@@ -496,6 +515,8 @@
 
 /**
  * A description of an [AnalysisTask].
+ *
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class TaskDescriptor {
   /**
@@ -537,7 +558,7 @@
  * A description of an input to an [AnalysisTask] that can be used to compute
  * that input.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class TaskInput<V> {
   /**
@@ -565,7 +586,7 @@
  * indicating that there are no more requests, the method [inputValue] can be
  * used to access the value of the input that was built.
  *
- * Clients are not expected to subtype this class.
+ * Clients may not extend, implement or mix-in this class.
  */
 abstract class TaskInputBuilder<V> {
   /**
@@ -633,6 +654,8 @@
  *
  * They know specific of the targets and results they care about,
  * so they can request analysis results in optimal order.
+ *
+ * Clients may implement this class when implementing plugins.
  */
 abstract class WorkManager {
   /**
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 3e8fa88..d30df1f 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,10 +1,10 @@
 name: analyzer
-version: 0.26.1+9
+version: 0.26.1+16
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.11.0 <2.0.0'
+  sdk: '>=1.12.0 <2.0.0'
 dependencies:
   args: '>=0.12.1 <0.14.0'
   glob: ^1.0.3
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index db5a1f2..dc07ef9 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -30,6 +30,7 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:path/path.dart';
+import 'package:source_span/source_span.dart';
 import 'package:unittest/unittest.dart';
 
 import '../reflective_tests.dart';
@@ -609,7 +610,7 @@
     expect(result.isValid, isTrue);
     DartObject value = result.value;
     expect(value.type.name, "double");
-    expect(value.doubleValue.isInfinite, isTrue);
+    expect(value.toDoubleValue().isInfinite, isTrue);
   }
 
   void test_divide_int_int() {
@@ -825,7 +826,7 @@
     EvaluationResult result = _getExpressionValue(contents);
     DartObject value = result.value;
     expect(value.type.name, "bool");
-    expect(value.boolValue, expectedValue);
+    expect(value.toBoolValue(), expectedValue);
   }
 
   void _assertValue2(double expectedValue, String contents) {
@@ -833,7 +834,7 @@
     expect(result.isValid, isTrue);
     DartObject value = result.value;
     expect(value.type.name, "double");
-    expect(value.doubleValue, expectedValue);
+    expect(value.toDoubleValue(), expectedValue);
   }
 
   void _assertValue3(int expectedValue, String contents) {
@@ -841,7 +842,7 @@
     expect(result.isValid, isTrue);
     DartObject value = result.value;
     expect(value.type.name, "int");
-    expect(value.intValue, expectedValue);
+    expect(value.toIntValue(), expectedValue);
   }
 
   void _assertValue4(String expectedValue, String contents) {
@@ -851,7 +852,7 @@
     ParameterizedType type = value.type;
     expect(type, isNotNull);
     expect(type.name, "String");
-    expect(value.stringValue, expectedValue);
+    expect(value.toStringValue(), expectedValue);
   }
 
   EvaluationResult _getExpressionValue(String contents) {
@@ -885,7 +886,7 @@
   void setUp() {
     super.setUp();
     _typeProvider = new TestTypeProvider();
-    _context = new TestAnalysisContext();
+    _context = new TestAnalysisContext_ConstantFinderTest();
     _source = new TestSource();
   }
 
@@ -2165,7 +2166,7 @@
       Map<String, DartObjectImpl> fields, String fieldName, int expectedValue) {
     DartObjectImpl field = fields[fieldName];
     expect(field.type.name, "int");
-    expect(field.intValue, expectedValue);
+    expect(field.toIntValue(), expectedValue);
   }
 
   void _assertNullField(Map<String, DartObjectImpl> fields, String fieldName) {
@@ -2198,7 +2199,7 @@
     expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
     expect(value.type, typeProvider.boolType);
-    bool boolValue = value.boolValue;
+    bool boolValue = value.toBoolValue();
     expect(boolValue, isNotNull);
     return boolValue;
   }
@@ -2207,7 +2208,7 @@
     expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
     expect(value.type, typeProvider.intType);
-    return value.intValue;
+    return value.toIntValue();
   }
 
   void _assertValidNull(EvaluationResultImpl result) {
@@ -2527,7 +2528,7 @@
   void _assertValue(int expectedValue, DartObjectImpl result) {
     expect(result, isNotNull);
     expect(result.type.name, "int");
-    expect(result.intValue, expectedValue);
+    expect(result.toIntValue(), expectedValue);
   }
 
   NonExistingSource _dummySource() {
@@ -3140,84 +3141,84 @@
     _assertGreaterThanOrEqual(_boolValue(null), _intValue(null), _intValue(2));
   }
 
-  void test_hasExactValue_bool_false() {
-    expect(_boolValue(false).hasExactValue, isTrue);
+  void test_hasKnownValue_bool_false() {
+    expect(_boolValue(false).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_bool_true() {
-    expect(_boolValue(true).hasExactValue, isTrue);
+  void test_hasKnownValue_bool_true() {
+    expect(_boolValue(true).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_bool_unknown() {
-    expect(_boolValue(null).hasExactValue, isTrue);
+  void test_hasKnownValue_bool_unknown() {
+    expect(_boolValue(null).hasKnownValue, isFalse);
   }
 
-  void test_hasExactValue_double_known() {
-    expect(_doubleValue(2.3).hasExactValue, isTrue);
+  void test_hasKnownValue_double_known() {
+    expect(_doubleValue(2.3).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_double_unknown() {
-    expect(_doubleValue(null).hasExactValue, isTrue);
+  void test_hasKnownValue_double_unknown() {
+    expect(_doubleValue(null).hasKnownValue, isFalse);
   }
 
-  void test_hasExactValue_dynamic() {
-    expect(_dynamicValue().hasExactValue, isFalse);
+  void test_hasKnownValue_dynamic() {
+    expect(_dynamicValue().hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_int_known() {
-    expect(_intValue(23).hasExactValue, isTrue);
+  void test_hasKnownValue_int_known() {
+    expect(_intValue(23).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_int_unknown() {
-    expect(_intValue(null).hasExactValue, isTrue);
+  void test_hasKnownValue_int_unknown() {
+    expect(_intValue(null).hasKnownValue, isFalse);
   }
 
-  void test_hasExactValue_list_empty() {
-    expect(_listValue().hasExactValue, isTrue);
+  void test_hasKnownValue_list_empty() {
+    expect(_listValue().hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_list_invalid() {
-    expect(_dynamicValue().hasExactValue, isFalse);
+  void test_hasKnownValue_list_invalidElement() {
+    expect(_listValue([_dynamicValue]).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_list_valid() {
-    expect(_listValue([_intValue(23)]).hasExactValue, isTrue);
+  void test_hasKnownValue_list_valid() {
+    expect(_listValue([_intValue(23)]).hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_map_empty() {
-    expect(_mapValue().hasExactValue, isTrue);
+  void test_hasKnownValue_map_empty() {
+    expect(_mapValue().hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_map_invalidKey() {
-    expect(_mapValue([_dynamicValue(), _stringValue("value")]).hasExactValue,
-        isFalse);
-  }
-
-  void test_hasExactValue_map_invalidValue() {
-    expect(_mapValue([_stringValue("key"), _dynamicValue()]).hasExactValue,
-        isFalse);
-  }
-
-  void test_hasExactValue_map_valid() {
-    expect(
-        _mapValue([_stringValue("key"), _stringValue("value")]).hasExactValue,
+  void test_hasKnownValue_map_invalidKey() {
+    expect(_mapValue([_dynamicValue(), _stringValue("value")]).hasKnownValue,
         isTrue);
   }
 
-  void test_hasExactValue_null() {
-    expect(_nullValue().hasExactValue, isTrue);
+  void test_hasKnownValue_map_invalidValue() {
+    expect(_mapValue([_stringValue("key"), _dynamicValue()]).hasKnownValue,
+        isTrue);
   }
 
-  void test_hasExactValue_num() {
-    expect(_numValue().hasExactValue, isFalse);
+  void test_hasKnownValue_map_valid() {
+    expect(
+        _mapValue([_stringValue("key"), _stringValue("value")]).hasKnownValue,
+        isTrue);
   }
 
-  void test_hasExactValue_string_known() {
-    expect(_stringValue("twenty-three").hasExactValue, isTrue);
+  void test_hasKnownValue_null() {
+    expect(_nullValue().hasKnownValue, isTrue);
   }
 
-  void test_hasExactValue_string_unknown() {
-    expect(_stringValue(null).hasExactValue, isTrue);
+  void test_hasKnownValue_num() {
+    expect(_numValue().hasKnownValue, isFalse);
+  }
+
+  void test_hasKnownValue_string_known() {
+    expect(_stringValue("twenty-three").hasKnownValue, isTrue);
+  }
+
+  void test_hasKnownValue_string_unknown() {
+    expect(_stringValue(null).hasKnownValue, isFalse);
   }
 
   void test_identical_bool_false() {
@@ -4774,7 +4775,7 @@
     variables.define(variableName, "false");
     DartObject object = variables.getBool(typeProvider, variableName);
     expect(object, isNotNull);
-    expect(object.boolValue, false);
+    expect(object.toBoolValue(), false);
   }
 
   void test_getBool_invalid() {
@@ -4793,7 +4794,7 @@
     variables.define(variableName, "true");
     DartObject object = variables.getBool(typeProvider, variableName);
     expect(object, isNotNull);
-    expect(object.boolValue, true);
+    expect(object.toBoolValue(), true);
   }
 
   void test_getBool_undefined() {
@@ -4828,7 +4829,7 @@
     variables.define(variableName, "23");
     DartObject object = variables.getInt(typeProvider, variableName);
     expect(object, isNotNull);
-    expect(object.intValue, 23);
+    expect(object.toIntValue(), 23);
   }
 
   void test_getString_defined() {
@@ -4839,7 +4840,7 @@
     variables.define(variableName, value);
     DartObject object = variables.getString(typeProvider, variableName);
     expect(object, isNotNull);
-    expect(object.stringValue, value);
+    expect(object.toStringValue(), value);
   }
 
   void test_getString_undefined() {
@@ -7334,6 +7335,27 @@
     expect(error.offset, element.nameOffset);
   }
 
+  void test_reportErrorForSpan() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter = new ErrorReporter(listener, new TestSource());
+
+    var src = '''
+foo: bar
+zap: baz
+''';
+
+    int offset = src.indexOf('baz');
+    int length = 'baz'.length;
+
+    SourceSpan span = new SourceFile(src).span(offset, offset + length);
+
+    reporter.reportErrorForSpan(
+        AnalysisOptionsWarningCode.UNSUPPORTED_OPTION, span, ['test', 'zap']);
+    expect(listener.errors, hasLength(1));
+    expect(listener.errors.first.offset, offset);
+    expect(listener.errors.first.length, length);
+  }
+
   void test_reportTypeErrorForNode_differentNames() {
     DartType firstType = createType("/test1.dart", "A");
     DartType secondType = createType("/test2.dart", "B");
@@ -9046,6 +9068,16 @@
   }
 }
 
+class TestAnalysisContext_ConstantFinderTest extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_ConstantFinderTest();
+
+  @override
+  InternalAnalysisContext getContextFor(Source source) {
+    return this;
+  }
+}
+
 /**
  * Instances of the class `ToSourceVisitorTest`
  */
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index e7c2025..e25c253 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -2318,6 +2318,13 @@
             AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
   }
 
+  void test_visitDefaultFormalParameter_annotation() {
+    DefaultFormalParameter parameter = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0));
+    parameter.metadata.add(AstFactory.annotation(AstFactory.identifier3("A")));
+    _assertSource('@A p = 0', parameter);
+  }
+
   void test_visitDoStatement() {
     _assertSource(
         "do {} while (c);",
@@ -2460,6 +2467,12 @@
         AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A"), "a"));
   }
 
+  void test_visitFieldFormalParameter_annotation() {
+    FieldFormalParameter parameter = AstFactory.fieldFormalParameter2('f');
+    parameter.metadata.add(AstFactory.annotation(AstFactory.identifier3("A")));
+    _assertSource('@A this.f', parameter);
+  }
+
   void test_visitForEachStatement_declared() {
     _assertSource(
         "for (var a in b) {}",
@@ -2898,6 +2911,12 @@
     _assertSource("f()", AstFactory.functionTypedFormalParameter(null, "f"));
   }
 
+  void test_visitFunctionTypedFormalParameter_annotation() {
+    FunctionTypedFormalParameter parameter = AstFactory.functionTypedFormalParameter(null, "f");
+    parameter.metadata.add(AstFactory.annotation(AstFactory.identifier3("A")));
+    _assertSource('@A f()', parameter);
+  }
+
   void test_visitFunctionTypedFormalParameter_type() {
     _assertSource(
         "T f()",
@@ -3521,6 +3540,12 @@
         AstFactory.simpleFormalParameter4(AstFactory.typeName4("A"), "a"));
   }
 
+  void test_visitSimpleFormalParameter_annotation() {
+    SimpleFormalParameter parameter = AstFactory.simpleFormalParameter3('x');
+    parameter.metadata.add(AstFactory.annotation(AstFactory.identifier3("A")));
+    _assertSource('@A x', parameter);
+  }
+
   void test_visitSimpleIdentifier() {
     _assertSource("a", AstFactory.identifier3("a"));
   }
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 43bc54f..7224060 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -865,6 +865,15 @@
     });
   }
 
+  void test_configurationData() {
+    var key = new newContext.ResultDescriptor('test_key', '');
+    var testData = ['test', 'data'];
+    _context.setConfigurationData(key, testData);
+    expect(_context.getConfigurationData(key), testData);
+    var unusedKey = new newContext.ResultDescriptor('unused_key', '');
+    expect(_context.getConfigurationData(unusedKey), null);
+  }
+
   void test_dispose() {
     expect(_context.isDisposed, isFalse);
     _context.dispose();
@@ -5949,6 +5958,11 @@
   }
 
   @override
+  Object getConfigurationData(newContext.ResultDescriptor key) {
+    fail("Unexpected invocation of getConfigurationData");
+  }
+
+  @override
   TimestampedData<String> getContents(Source source) {
     fail("Unexpected invocation of getContents");
     return null;
@@ -6166,6 +6180,11 @@
   }
 
   @override
+  void setConfigurationData(newContext.ResultDescriptor key, Object data) {
+    fail("Unexpected invocation of setConfigurationData");
+  }
+
+  @override
   void setContents(Source source, String contents) {
     fail("Unexpected invocation of setContents");
   }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 8a6c71f..56aa853 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1856,6 +1856,30 @@
     verify([source]);
   }
 
+  void test_functionWithoutCall_withNoSuchMethod_mixin() {
+    Source source = addSource(r'''
+class A {
+  noSuchMethod(inv) {}
+}
+class B extends Object with A implements Function {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_withNoSuchMethod_superclass() {
+    Source source = addSource(r'''
+class A {
+  noSuchMethod(inv) {}
+}
+class B extends A implements Function {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_implicitConstructorDependencies() {
     // No warning should be generated for the code below; this requires that
     // implicit constructors are generated for C1 before C2, even though C1
@@ -3623,6 +3647,32 @@
     verify([source]);
   }
 
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_mixin() {
+    Source source = addSource(r'''
+class A {
+  noSuchMethod(v) => '';
+}
+class B extends Object with A {
+  m(p);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_superclass() {
+    Source source = addSource(r'''
+class A {
+  noSuchMethod(v) => '';
+}
+class B extends A {
+  m(p);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_overridesMethodInObject() {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 98e80de..51e4941 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3221,6 +3221,17 @@
     expect(expression.thenExpression.isSynthetic, isTrue);
   }
 
+  void test_declarationBeforeDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "class foo { } import 'bar.dart';",
+        [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(1));
+    ClassDeclaration classDecl = unit.childEntities.first;
+    expect(classDecl, isNotNull);
+    expect(classDecl.name.name, 'foo');
+  }
+
   void test_equalityExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
@@ -3338,17 +3349,6 @@
     parseExpression("m(f() => 0);", [ParserErrorCode.EXPECTED_TOKEN]);
   }
 
-  void test_declarationBeforeDirective() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
-        "class foo { } import 'bar.dart';",
-        [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(1));
-    ClassDeclaration classDecl = unit.childEntities.first;
-    expect(classDecl, isNotNull);
-    expect(classDecl.name.name, 'foo');
-  }
-
   void test_importDirectivePartial_as() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(
         "import 'b.dart' d as b;", [ParserErrorCode.UNEXPECTED_TOKEN]);
@@ -3549,6 +3549,53 @@
     expect(field.name.isSynthetic, isTrue);
   }
 
+  void test_incompleteForEach() {
+    ForStatement statement = ParserTestCase.parseStatement(
+        'for (String item i) {}',
+        [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<ForStatement>());
+    expect(statement.toSource(), 'for (String item; i;) {}');
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.leftSeparator.type, TokenType.SEMICOLON);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.rightSeparator.type, TokenType.SEMICOLON);
+  }
+
+  void test_incompleteLocalVariable_atTheEndOfBlock() {
+    Statement statement = ParserTestCase.parseStatement(
+        'String v }', [ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+    expect(statement.toSource(), 'String v;');
+  }
+
+  void test_incompleteLocalVariable_beforeIdentifier() {
+    Statement statement = ParserTestCase.parseStatement(
+        'String v String v2;', [ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+    expect(statement.toSource(), 'String v;');
+  }
+
+  void test_incompleteLocalVariable_beforeKeyword() {
+    Statement statement = ParserTestCase.parseStatement(
+        'String v if (true) {}', [ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+    expect(statement.toSource(), 'String v;');
+  }
+
+  void test_incompleteLocalVariable_beforeNextBlock() {
+    Statement statement = ParserTestCase.parseStatement(
+        'String v {}', [ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+    expect(statement.toSource(), 'String v;');
+  }
+
+  void test_incompleteLocalVariable_parameterizedType() {
+    Statement statement = ParserTestCase.parseStatement(
+        'List<String> v {}', [ParserErrorCode.EXPECTED_TOKEN]);
+    expect(statement, new isInstanceOf<VariableDeclarationStatement>());
+    expect(statement.toSource(), 'List<String> v;');
+  }
+
   void test_invalidFunctionBodyModifier() {
     ParserTestCase.parseCompilationUnit(
         "f() sync {}", [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
@@ -9423,7 +9470,7 @@
     expect(identifier.name, lexeme);
   }
 
-  void test_parseStatement_emptyTypeArgumentListt() {
+  void test_parseStatement_emptyTypeArgumentList() {
     VariableDeclarationStatement statement = parse4(
         "parseStatement", "C<> c;", [ParserErrorCode.EXPECTED_TYPE_NAME]);
     VariableDeclarationList variables = statement.variables;
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 79ccd58..99ab84c 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -832,6 +832,27 @@
     verify([source]);
   }
 
+  // https://github.com/dart-lang/sdk/issues/24713
+  void test_returnOfInvalidType_not_issued_for_valid_generic_return() {
+    Source source = addSource(r'''
+abstract class F<T, U>  {
+  U get value;
+}
+
+abstract class G<T> {
+  T test(F<int, T> arg) => arg.value;
+}
+
+abstract class H<S> {
+  S test(F<int, S> arg) => arg.value;
+}
+
+void main() { }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_returnOfInvalidType_void() {
     Source source = addSource("void f() { return 42; }");
     computeLibrarySourceErrors(source);
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 3d63d3c..f48528e 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -964,6 +964,20 @@
     verify([source]);
   }
 
+  void test_concreteClassWithAbstractMember_noSuchMethod_interface() {
+    Source source = addSource(r'''
+class I {
+  noSuchMethod(v) => '';
+}
+class A implements I {
+  m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER]);
+    verify([source]);
+  }
+
   void test_conflictingDartImport() {
     Source source = addSource(r'''
 import 'lib.dart';
@@ -2652,6 +2666,23 @@
         [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
   }
 
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_interface() {
+    // 15979
+    Source source = addSource(r'''
+class I {
+  noSuchMethod(v) => '';
+}
+abstract class A {
+  m();
+}
+class B extends A implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() {
     // test from language/override_inheritance_abstract_test_14.dart
     Source source = addSource(r'''
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index a251770..4cf41fd 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -43,7 +43,7 @@
   });
   group('AnalysisOptionsProvider', () {
     setUp(() {
-      buildResourceProvider(true);
+      buildResourceProvider(emptyAnalysisOptions: true);
     });
     tearDown(() {
       clearResourceProvider();
@@ -57,7 +57,7 @@
   });
   group('AnalysisOptionsProvider', () {
     setUp(() {
-      buildResourceProvider(false, true);
+      buildResourceProvider(badAnalysisOptions: true);
     });
     tearDown(() {
       clearResourceProvider();
@@ -79,15 +79,15 @@
 
 MemoryResourceProvider resourceProvider;
 
-buildResourceProvider([bool emptyAnalysisOptions = false,
-                       bool badAnalysisOptions = false]) {
+buildResourceProvider({bool emptyAnalysisOptions : false,
+                       bool badAnalysisOptions : false}) {
   resourceProvider = new MemoryResourceProvider();
   resourceProvider.newFolder('/empty');
   resourceProvider.newFolder('/tmp');
   if (badAnalysisOptions) {
     resourceProvider.newFile('/.analysis_options', r''':''');
   } else if (emptyAnalysisOptions) {
-    resourceProvider.newFile('/.analysis_options', r'''''');
+    resourceProvider.newFile('/.analysis_options', r'''#empty''');
   } else {
     resourceProvider.newFile(
       '/.analysis_options',
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 69c86e9..1455f20 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -664,6 +664,15 @@
     });
   }
 
+  void test_configurationData() {
+    var key = new ResultDescriptor('test_key', '');
+    var testData = ['test', 'data'];
+    context.setConfigurationData(key, testData);
+    expect(context.getConfigurationData(key), testData);
+    var unusedKey = new ResultDescriptor('unused_key', '');
+    expect(context.getConfigurationData(unusedKey), null);
+  }
+
   void test_dispose() {
     expect(context.isDisposed, isFalse);
     context.dispose();
@@ -801,15 +810,7 @@
     expect(contents.data.toString(), content);
   }
 
-  void test_getContents_overridden() {
-    String content = "library lib;";
-    Source source = new TestSource();
-    context.setContents(source, content);
-    TimestampedData<String> contents = context.getContents(source);
-    expect(contents.data.toString(), content);
-  }
-
-  void test_getContents_unoverridden() {
+  void test_getContents_notOverridden() {
     String content = "library lib;";
     Source source = new TestSource('/test.dart', content);
     context.setContents(source, "part of lib;");
@@ -818,6 +819,14 @@
     expect(contents.data.toString(), content);
   }
 
+  void test_getContents_overridden() {
+    String content = "library lib;";
+    Source source = new TestSource();
+    context.setContents(source, content);
+    TimestampedData<String> contents = context.getContents(source);
+    expect(contents.data.toString(), content);
+  }
+
   void test_getDeclaredVariables() {
     expect(context.declaredVariables, isNotNull);
   }
@@ -1037,7 +1046,7 @@
         r'''
 import 'a.dart';
 main() {}''');
-    context.computeLibraryElement(source);
+    _analyzeAll_assertFinished();
     sources = context.launchableClientLibrarySources;
     expect(sources, unorderedEquals([source]));
   }
@@ -1055,7 +1064,7 @@
         r'''
 import 'a.dart';
 main() {}''');
-    context.computeLibraryElement(source);
+    _analyzeAll_assertFinished();
     sources = context.launchableClientLibrarySources;
     expect(sources, unorderedEquals([source]));
   }
@@ -1084,12 +1093,12 @@
         r'''
 import 'dart:html';
 ''');
-    Source source = addSource(
+    addSource(
         "/test.dart",
         r'''
 import 'imports_html.dart';
 main() {}''');
-    context.computeLibraryElement(source);
+    _analyzeAll_assertFinished();
     expect(context.launchableServerLibrarySources, isEmpty);
   }
 
@@ -1798,6 +1807,31 @@
         reason: "libA has an error");
   }
 
+  void test_performAnalysisTask_interruptBy_setContents() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library expectedToFindSemicolon
+''');
+    // Analyze to the point where some of the results stop depending on
+    // the source content.
+    LibrarySpecificUnit unitA = new LibrarySpecificUnit(sourceA, sourceA);
+    for (int i = 0; i < 10000; i++) {
+      context.performAnalysisTask();
+      if (context.getResult(unitA, RESOLVED_UNIT2) != null) {
+        break;
+      }
+    }
+    // Update the source.
+    // This should invalidate all the results and also reset the driver.
+    context.setContents(sourceA, "library semicolonWasAdded;");
+    expect(context.getResult(unitA, RESOLVED_UNIT2), isNull);
+    expect(analysisDriver.currentWorkOrder, isNull);
+    // Continue analysis.
+    _analyzeAll_assertFinished();
+    expect(context.getErrors(sourceA).errors, isEmpty);
+  }
+
   void test_performAnalysisTask_IOException() {
     TestSource source = _addSourceWithException2("/test.dart", "library test;");
     source.generateExceptionOnRead = false;
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index 5c4f251..a60b879 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -39,7 +39,6 @@
   runReflectiveTests(BuildLibraryElementTaskTest);
   runReflectiveTests(BuildPublicNamespaceTaskTest);
   runReflectiveTests(BuildSourceExportClosureTaskTest);
-  runReflectiveTests(BuildSourceImportExportClosureTaskTest);
   runReflectiveTests(BuildTypeProviderTaskTest);
   runReflectiveTests(ComputeConstantDependenciesTaskTest);
   runReflectiveTests(ComputeConstantValueTaskTest);
@@ -84,8 +83,6 @@
     new isInstanceOf<BuildPublicNamespaceTask>();
 isInstanceOf isBuildSourceExportClosureTask =
     new isInstanceOf<BuildSourceExportClosureTask>();
-isInstanceOf isBuildSourceImportExportClosureTask =
-    new isInstanceOf<BuildSourceImportExportClosureTask>();
 isInstanceOf isBuildTypeProviderTask =
     new isInstanceOf<BuildTypeProviderTask>();
 isInstanceOf isComputeConstantDependenciesTask =
@@ -841,8 +838,12 @@
 void set test(_) {}
 '''
     });
-    CompilationUnitElement unitElement1 = partUnits[0].element;
-    CompilationUnitElement unitElement2 = partUnits[1].element;
+    CompilationUnitElement unitElement1 = partUnits
+        .singleWhere((u) => u.element.name.endsWith('part1.dart'))
+        .element;
+    CompilationUnitElement unitElement2 = partUnits
+        .singleWhere((u) => u.element.name.endsWith('part2.dart'))
+        .element;
     PropertyAccessorElement getter = unitElement1.accessors[0];
     PropertyAccessorElement setter = unitElement2.accessors[0];
     PropertyInducingElement variable = getter.variable;
@@ -950,113 +951,6 @@
 }
 
 @reflectiveTest
-class BuildSourceImportExportClosureTaskTest extends _AbstractDartTaskTest {
-  test_perform_importExportClosure() {
-    Source sourceA = newSource(
-        '/a.dart',
-        '''
-library lib_a;
-''');
-    Source sourceB = newSource(
-        '/b.dart',
-        '''
-library lib_b;
-export 'a.dart';
-''');
-    Source sourceC = newSource(
-        '/c.dart',
-        '''
-library lib_c;
-import 'b.dart';
-''');
-    Source coreSource = context.sourceFactory.resolveUri(null, 'dart:core');
-    // c.dart
-    {
-      computeResult(sourceC, IMPORT_EXPORT_SOURCE_CLOSURE,
-          matcher: isBuildSourceImportExportClosureTask);
-      List<Source> closure = outputs[IMPORT_EXPORT_SOURCE_CLOSURE];
-      expect(closure, contains(sourceA));
-      expect(closure, contains(sourceB));
-      expect(closure, contains(sourceC));
-      expect(closure, contains(coreSource));
-    }
-    // b.dart
-    {
-      computeResult(sourceB, IMPORT_EXPORT_SOURCE_CLOSURE,
-          matcher: isBuildSourceImportExportClosureTask);
-      List<Source> closure = outputs[IMPORT_EXPORT_SOURCE_CLOSURE];
-      expect(closure, contains(sourceA));
-      expect(closure, contains(sourceB));
-      expect(closure, contains(coreSource));
-    }
-  }
-
-  test_perform_isClient_false() {
-    Source sourceA = newSource(
-        '/a.dart',
-        '''
-library lib_a;
-import 'b.dart';
-''');
-    newSource(
-        '/b.dart',
-        '''
-library lib_b;
-''');
-    computeResult(sourceA, IS_CLIENT,
-        matcher: isBuildSourceImportExportClosureTask);
-    expect(outputs[IS_CLIENT], isFalse);
-  }
-
-  test_perform_isClient_true_export_indirect() {
-    newSource(
-        '/exports_html.dart',
-        '''
-library lib_exports_html;
-export 'dart:html';
-''');
-    Source source = newSource(
-        '/test.dart',
-        '''
-import 'exports_html.dart';
-''');
-    computeResult(source, IS_CLIENT,
-        matcher: isBuildSourceImportExportClosureTask);
-    expect(outputs[IS_CLIENT], isTrue);
-  }
-
-  test_perform_isClient_true_import_direct() {
-    Source sourceA = newSource(
-        '/a.dart',
-        '''
-library lib_a;
-import 'dart:html';
-''');
-    computeResult(sourceA, IS_CLIENT,
-        matcher: isBuildSourceImportExportClosureTask);
-    expect(outputs[IS_CLIENT], isTrue);
-  }
-
-  test_perform_isClient_true_import_indirect() {
-    Source sourceA = newSource(
-        '/a.dart',
-        '''
-library lib_a;
-import 'b.dart';
-''');
-    newSource(
-        '/b.dart',
-        '''
-library lib_b;
-import 'dart:html';
-''');
-    computeResult(sourceA, IS_CLIENT,
-        matcher: isBuildSourceImportExportClosureTask);
-    expect(outputs[IS_CLIENT], isTrue);
-  }
-}
-
-@reflectiveTest
 class BuildTypeProviderTaskTest extends _AbstractDartTaskTest {
   test_perform() {
     computeResult(AnalysisContextTarget.request, TYPE_PROVIDER,
@@ -1267,7 +1161,7 @@
     expect(evaluationResult.value.type, isNotNull);
     expect(evaluationResult.value.type.name, 'D');
     expect(evaluationResult.value.fields, contains('value'));
-    expect(evaluationResult.value.fields['value'].intValue, 1);
+    expect(evaluationResult.value.fields['value'].toIntValue(), 1);
   }
 
   test_annotation_without_args() {
@@ -1285,7 +1179,7 @@
     // And check that it has the expected value.
     expect(evaluationResult, isNotNull);
     expect(evaluationResult.value, isNotNull);
-    expect(evaluationResult.value.intValue, 1);
+    expect(evaluationResult.value.toIntValue(), 1);
   }
 
   test_circular_reference() {
@@ -1342,7 +1236,7 @@
 ''');
     expect(evaluationResult, isNotNull);
     expect(evaluationResult.value, isNotNull);
-    expect(evaluationResult.value.intValue, 2);
+    expect(evaluationResult.value.toIntValue(), 2);
   }
 
   test_external_const_factory() {
@@ -1368,7 +1262,7 @@
 ''');
     expect(evaluationResult, isNotNull);
     expect(evaluationResult.value, isNotNull);
-    expect(evaluationResult.value.intValue, 1);
+    expect(evaluationResult.value.toIntValue(), 1);
   }
 
   void _checkCircularities(
@@ -2357,12 +2251,12 @@
   void setUp() {
     super.setUp();
     enableLints();
-    lintRegistry[context] = [new GenerateLintsTaskTest_TestLinter()];
+    setLints(context, [new GenerateLintsTaskTest_TestLinter()]);
   }
 
   @override
   void tearDown() {
-    lintRegistry[context] = [];
+    setLints(context, []);
     super.tearDown();
   }
 
@@ -2799,11 +2693,12 @@
     _performParseTask(r'''
 part of lib;
 class B {}''');
-    expect(outputs, hasLength(8));
+    expect(outputs, hasLength(9));
     expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
     expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
     expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(1));
     expect(outputs[PARSE_ERRORS], hasLength(0));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[SOURCE_KIND], SourceKind.PART);
@@ -2832,11 +2727,12 @@
 
   test_perform_doesNotExist() {
     _performParseTask(null);
-    expect(outputs, hasLength(8));
+    expect(outputs, hasLength(9));
     expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
     expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
     expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(1));
     expect(outputs[PARSE_ERRORS], hasLength(0));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[SOURCE_KIND], SourceKind.UNKNOWN);
@@ -2851,11 +2747,12 @@
 export '${a}lib3.dart';
 part 'part.dart';
 class A {}''');
-    expect(outputs, hasLength(8));
+    expect(outputs, hasLength(9));
     expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(1));
     expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 2);
     expect(outputs[INCLUDED_PARTS], hasLength(1));
+    expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(2));
     expect(outputs[PARSE_ERRORS], hasLength(2));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
@@ -2869,11 +2766,12 @@
 export 'lib3.dart';
 part 'part.dart';
 class A {''');
-    expect(outputs, hasLength(8));
+    expect(outputs, hasLength(9));
     expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(1));
     expect(outputs[EXPORTED_LIBRARIES], hasLength(1));
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 2);
     expect(outputs[INCLUDED_PARTS], hasLength(1));
+    expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(2));
     expect(outputs[PARSE_ERRORS], hasLength(1));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
@@ -2892,11 +2790,12 @@
     _performParseTask(r'''
 part of lib;
 class B {}''');
-    expect(outputs, hasLength(8));
+    expect(outputs, hasLength(9));
     expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
     expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
     _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
     expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[LIBRARY_SPECIFIC_UNITS], hasLength(1));
     expect(outputs[PARSE_ERRORS], hasLength(0));
     expect(outputs[PARSED_UNIT], isNotNull);
     expect(outputs[SOURCE_KIND], SourceKind.PART);
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
new file mode 100644
index 0000000..5dddc25
--- /dev/null
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2015, the Dart 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.
+
+library test.src.task.options_test;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import '../context/abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(GenerateOptionsErrorsTaskTest);
+  runReflectiveTests(OptionsFileValidatorTest);
+}
+
+isInstanceOf isGenerateOptionsErrorsTask =
+    new isInstanceOf<GenerateOptionsErrorsTask>();
+
+@reflectiveTest
+class GenerateOptionsErrorsTaskTest extends AbstractContextTest {
+  final optionsFilePath = '/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}';
+
+  Source source;
+  @override
+  setUp() {
+    super.setUp();
+    source = newSource(optionsFilePath);
+  }
+
+  test_buildInputs() {
+    Map<String, TaskInput> inputs =
+        GenerateOptionsErrorsTask.buildInputs(source);
+    expect(inputs, isNotNull);
+    expect(inputs.keys,
+        unorderedEquals([GenerateOptionsErrorsTask.CONTENT_INPUT_NAME]));
+  }
+
+  test_constructor() {
+    GenerateOptionsErrorsTask task =
+        new GenerateOptionsErrorsTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_createTask() {
+    GenerateOptionsErrorsTask task =
+        GenerateOptionsErrorsTask.createTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_description() {
+    GenerateOptionsErrorsTask task =
+        new GenerateOptionsErrorsTask(null, source);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = GenerateOptionsErrorsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_bad_yaml() {
+    String code = r'''
+:
+''';
+    AnalysisTarget target = newSource(optionsFilePath, code);
+    computeResult(target, ANALYSIS_OPTIONS_ERRORS);
+    expect(task, isGenerateOptionsErrorsTask);
+    List<AnalysisError> errors = outputs[ANALYSIS_OPTIONS_ERRORS];
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode, AnalysisOptionsErrorCode.PARSE_ERROR);
+  }
+
+  test_perform_OK() {
+    String code = r'''
+analyzer:
+  strong-mode: true
+''';
+    AnalysisTarget target = newSource(optionsFilePath, code);
+    computeResult(target, ANALYSIS_OPTIONS_ERRORS);
+    expect(task, isGenerateOptionsErrorsTask);
+    expect(outputs[ANALYSIS_OPTIONS_ERRORS], isEmpty);
+    LineInfo lineInfo = outputs[LINE_INFO];
+    expect(lineInfo, isNotNull);
+    expect(lineInfo.getLocation(1).lineNumber, 1);
+    expect(lineInfo.getLocation(10).lineNumber, 2);
+  }
+
+  test_perform_unsupported_analyzer_option() {
+    String code = r'''
+analyzer:
+  not_supported: true
+''';
+    AnalysisTarget target = newSource(optionsFilePath, code);
+    computeResult(target, ANALYSIS_OPTIONS_ERRORS);
+    expect(task, isGenerateOptionsErrorsTask);
+    List<AnalysisError> errors = outputs[ANALYSIS_OPTIONS_ERRORS];
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode, AnalysisOptionsWarningCode.UNSUPPORTED_OPTION);
+    expect(errors[0].message,
+        "The option 'not_supported' is not supported by analyzer");
+  }
+}
+
+@reflectiveTest
+class OptionsFileValidatorTest {
+  final OptionsFileValidator validator =
+      new OptionsFileValidator(new TestSource());
+  final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
+
+  test_analyzer_supported_exclude() {
+    validate(
+        '''
+analyzer:
+  exclude:
+    - test/_data/p4/lib/lib1.dart
+    ''',
+        []);
+  }
+
+  test_analyzer_supported_strong_mode() {
+    validate(
+        '''
+analyzer:
+  strong-mode: true
+    ''',
+        []);
+  }
+
+  test_analyzer_unsupported_option() {
+    validate(
+        '''
+analyzer:
+  not_supported: true
+    ''',
+        [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION]);
+  }
+
+  test_linter_supported_rules() {
+    validate(
+        '''
+linter:
+  rules:
+    - camel_case_types
+    ''',
+        []);
+  }
+
+  test_linter_unsupported_option() {
+    validate(
+        '''
+linter:
+  unsupported: true
+    ''',
+        [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION]);
+  }
+
+  void validate(String source, List<AnalysisOptionsErrorCode> expected) {
+    var options = optionsProvider.getOptionsFromString(source);
+    var errors = validator.validate(options);
+    expect(errors.map((AnalysisError e) => e.errorCode),
+        unorderedEquals(expected));
+  }
+}
diff --git a/pkg/analyzer/test/src/task/options_work_manager_test.dart b/pkg/analyzer/test/src/task/options_work_manager_test.dart
new file mode 100644
index 0000000..424a729
--- /dev/null
+++ b/pkg/analyzer/test/src/task/options_work_manager_test.dart
@@ -0,0 +1,287 @@
+// Copyright (c) 2015, the Dart 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.
+
+library test.src.task.options_work_manager_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        CacheState,
+        ChangeNoticeImpl,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart'
+    show AnalysisError, AnalysisOptionsErrorCode;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/task/options_work_manager.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(OptionsWorkManagerTest);
+}
+
+@reflectiveTest
+class OptionsWorkManagerTest {
+  static final optionsFile = AnalysisEngine.ANALYSIS_OPTIONS_FILE;
+  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  AnalysisCache cache;
+
+  OptionsWorkManager manager;
+
+  CaughtException caughtException = new CaughtException(null, null);
+
+  Source source1 = new TestSource('test1/$optionsFile');
+  Source source2 = new TestSource('test2/$optionsFile');
+  Source source3 = new TestSource('test3/$optionsFile');
+  Source source4 = new TestSource('test4/$optionsFile');
+  CacheEntry entry1;
+  CacheEntry entry2;
+  CacheEntry entry3;
+  CacheEntry entry4;
+
+  void expect_sourceQueue(List<Source> sources) {
+    expect(manager.sourceQueue, unorderedEquals(sources));
+  }
+
+  void setUp() {
+    cache = context.analysisCache;
+    manager = new OptionsWorkManager(context);
+    entry1 = context.getCacheEntry(source1);
+    entry2 = context.getCacheEntry(source2);
+    entry3 = context.getCacheEntry(source3);
+    entry4 = context.getCacheEntry(source4);
+  }
+
+  void test_applyChange_add() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+    // add source2
+    manager.applyChange([source2], [], []);
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_applyChange_add_duplicate() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+    // add source1 again
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+  }
+
+  void test_applyChange_change() {
+    // change source1
+    manager.applyChange([], [source1], []);
+    expect_sourceQueue([source1]);
+  }
+
+  void test_applyChange_change_afterAdd() {
+    manager.applyChange([source1, source2], [], []);
+    // change source1
+    manager.applyChange([], [source1], []);
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_applyChange_remove() {
+    manager.applyChange([source1, source2], [], []);
+    // remove source1
+    manager.applyChange([], [], [source1]);
+    expect_sourceQueue([source2]);
+    // remove source2
+    manager.applyChange([], [], [source2]);
+    expect_sourceQueue([]);
+    // remove source3
+    manager.applyChange([], [], [source3]);
+    expect_sourceQueue([]);
+  }
+
+  void test_applyPriorityTargets() {
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+    when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(true);
+    manager.priorityResultQueue
+        .add(new TargetedResult(source1, ANALYSIS_OPTIONS_ERRORS));
+    manager.priorityResultQueue
+        .add(new TargetedResult(source2, ANALYSIS_OPTIONS_ERRORS));
+    // -source1 +source3
+    manager.applyPriorityTargets([source2, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source2, ANALYSIS_OPTIONS_ERRORS),
+          new TargetedResult(source3, ANALYSIS_OPTIONS_ERRORS)
+        ]));
+    // get next request
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+  }
+
+  void test_getErrors() {
+    AnalysisError error1 = new AnalysisError(
+        source1, 1, 0, AnalysisOptionsErrorCode.PARSE_ERROR, ['']);
+    AnalysisError error2 = new AnalysisError(
+        source1, 2, 0, AnalysisOptionsErrorCode.PARSE_ERROR, ['']);
+    entry1.setValue(
+        ANALYSIS_OPTIONS_ERRORS, <AnalysisError>[error1, error2], []);
+
+    List<AnalysisError> errors = manager.getErrors(source1);
+    expect(errors, unorderedEquals([error1, error2]));
+  }
+
+  void test_getNextResult_hasNormal_firstIsError() {
+    entry1.setErrorState(caughtException, [ANALYSIS_OPTIONS_ERRORS]);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+    // source1 is out, source2 is waiting
+    expect_sourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasNormal_firstIsInvalid() {
+    entry1.setState(ANALYSIS_OPTIONS_ERRORS, CacheState.INVALID);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+    // no changes until computed
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasNormal_firstIsValid() {
+    entry1.setValue(ANALYSIS_OPTIONS_ERRORS, [], []);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+    // source1 is out, source2 is waiting
+    expect_sourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasNormalAndPriority() {
+    entry1.setState(ANALYSIS_OPTIONS_ERRORS, CacheState.INVALID);
+    manager.sourceQueue.addAll([source1, source2]);
+    manager.addPriorityResult(source3, ANALYSIS_OPTIONS_ERRORS);
+
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source3);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+    // no changes until computed
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasPriority() {
+    manager.addPriorityResult(source1, ANALYSIS_OPTIONS_ERRORS);
+    manager.addPriorityResult(source2, ANALYSIS_OPTIONS_ERRORS);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, ANALYSIS_OPTIONS_ERRORS),
+          new TargetedResult(source2, ANALYSIS_OPTIONS_ERRORS)
+        ]));
+
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, ANALYSIS_OPTIONS_ERRORS);
+    // no changes until computed
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, ANALYSIS_OPTIONS_ERRORS),
+          new TargetedResult(source2, ANALYSIS_OPTIONS_ERRORS)
+        ]));
+  }
+
+  void test_getNextResult_nothingToDo() {
+    TargetedResult request = manager.getNextResult();
+    expect(request, isNull);
+  }
+
+  void test_getNextResultPriority_hasPriority() {
+    manager.addPriorityResult(source1, SOURCE_KIND);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
+  }
+
+  void test_getNextResultPriority_hasSource() {
+    manager.sourceQueue.addAll([source1]);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
+  }
+
+  void test_getNextResultPriority_nothingToDo() {
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
+  }
+
+  void test_resultsComputed_errors() {
+    AnalysisError error1 = new AnalysisError(
+        source1, 1, 0, AnalysisOptionsErrorCode.PARSE_ERROR, ['']);
+    AnalysisError error2 = new AnalysisError(
+        source1, 2, 0, AnalysisOptionsErrorCode.PARSE_ERROR, ['']);
+    LineInfo lineInfo = new LineInfo([0]);
+    entry1.setValue(LINE_INFO, lineInfo, []);
+    entry1.setValue(
+        ANALYSIS_OPTIONS_ERRORS, <AnalysisError>[error1, error2], []);
+    // RESOLVED_UNIT is ready, set errors
+    manager.resultsComputed(source1, {ANALYSIS_OPTIONS_ERRORS: null});
+    // all of the errors are included
+    ChangeNoticeImpl notice = context.getNotice(source1);
+    expect(notice.errors, unorderedEquals([error1, error2]));
+    expect(notice.lineInfo, lineInfo);
+  }
+}
+
+class _InternalAnalysisContextMock extends TypedMock
+    implements InternalAnalysisContext {
+  @override
+  CachePartition privateAnalysisCachePartition;
+
+  @override
+  AnalysisCache analysisCache;
+
+  Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
+
+  _InternalAnalysisContextMock() {
+    privateAnalysisCachePartition = new UniversalCachePartition(this);
+    analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    CacheEntry entry = analysisCache.get(target);
+    if (entry == null) {
+      entry = new CacheEntry(target);
+      analysisCache.put(entry);
+    }
+    return entry;
+  }
+
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    List<AnalysisError> errors = AnalysisError.NO_ERRORS;
+    if (AnalysisEngine.isAnalysisOptionsFileName(source.shortName)) {
+      errors = getCacheEntry(source).getValue(ANALYSIS_OPTIONS_ERRORS);
+    }
+    return new AnalysisErrorInfoImpl(
+        errors, getCacheEntry(source).getValue(LINE_INFO));
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) =>
+      _pendingNotices.putIfAbsent(source, () => new ChangeNoticeImpl(source));
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 874916c..aa51b50 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -984,7 +984,7 @@
           lOfAs = /*severe:StaticTypeError*/mOfOs;
           lOfAs = mOfAs;
           lOfAs = /*warning:DownCastComposite*/lOfDs;
-          lOfAs = /*warning:DownCastComposite*/lOfOs;
+          lOfAs = /*info:DownCastImplicit*/lOfOs;
           lOfAs = lOfAs;
         }
         {
@@ -993,7 +993,7 @@
           mOfDs = mOfAs;
           mOfDs = /*info:DownCastImplicit*/lOfDs;
           mOfDs = /*info:DownCastImplicit*/lOfOs;
-          mOfDs = /*info:DownCastImplicit*/lOfAs;
+          mOfDs = /*warning:DownCastComposite*/lOfAs;
         }
         {
           mOfOs = mOfDs;
@@ -1005,11 +1005,11 @@
         }
         {
           mOfAs = /*warning:DownCastComposite*/mOfDs;
-          mOfAs = /*warning:DownCastComposite*/mOfOs;
+          mOfAs = /*info:DownCastImplicit*/mOfOs;
           mOfAs = mOfAs;
           mOfAs = /*warning:DownCastComposite*/lOfDs;
-          mOfAs = /*warning:DownCastComposite*/lOfOs;
-          mOfAs = /*warning:DownCastComposite*/lOfAs;
+          mOfAs = /*info:DownCastImplicit*/lOfOs;
+          mOfAs = /*info:DownCastImplicit*/lOfAs;
         }
 
       }
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 51d4a1d..125b356 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -386,6 +386,23 @@
         int bar = 42;
       }
 
+      class Bar<T extends Iterable<String>> {
+        void foo(T t) {
+          for (var i in t) {
+            int x = /*severe:StaticTypeError*/i;
+          }
+        }
+      }
+
+      class Baz<T, E extends Iterable<T>, S extends E> {
+        void foo(S t) {
+          for (var i in t) {
+            int x = /*severe:StaticTypeError*/i;
+            T y = i;
+          }
+        }
+      }
+
       test() {
         var list = <Foo>[];
         for (var x in list) {
diff --git a/pkg/analyzer/test/src/task/test_all.dart b/pkg/analyzer/test/src/task/test_all.dart
index 62fe20f..ffe976c 100644
--- a/pkg/analyzer/test/src/task/test_all.dart
+++ b/pkg/analyzer/test/src/task/test_all.dart
@@ -18,6 +18,8 @@
 import 'inputs_test.dart' as inputs_test;
 import 'manager_test.dart' as manager_test;
 import 'model_test.dart' as model_test;
+import 'options_test.dart' as options_test;
+import 'options_work_manager_test.dart' as options_work_manager_test;
 import 'strong_mode_test.dart' as strong_mode_test;
 
 /// Utility for manually running all tests.
@@ -34,6 +36,8 @@
     inputs_test.main();
     manager_test.main();
     model_test.main();
+    options_test.main();
+    options_work_manager_test.main();
     strong_mode_test.main();
   });
 }
diff --git a/pkg/analyzer/tool/generate_files b/pkg/analyzer/tool/generate_files
new file mode 100755
index 0000000..4d0b220
--- /dev/null
+++ b/pkg/analyzer/tool/generate_files
@@ -0,0 +1,50 @@
+#!/bin/bash
+# Copyright (c) 2014, the Dart 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.
+#
+# This script executes code generation tools found in the analyzer
+# "tool" directory.
+
+set -e
+
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+SCRIPT_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
+ROOT_DIR="$(cd "${SCRIPT_DIR}/../../.." ; pwd -P)"
+
+BIN_DIR="${ROOT_DIR}/sdk/bin"
+
+if [ -z "$DART_CONFIGURATION" ];
+then
+  DART_CONFIGURATION="ReleaseIA32"
+fi
+
+if [[ `uname` == 'Darwin' ]];
+then
+  BUILD_DIR="${ROOT_DIR}/xcodebuild/$DART_CONFIGURATION"
+else
+  BUILD_DIR="${ROOT_DIR}/out/$DART_CONFIGURATION"
+fi
+
+PKG_DIR="${BUILD_DIR}/packages"
+
+DART="${BIN_DIR}/dart"
+
+declare -a VM_OPTIONS
+VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--package-root=${PKG_DIR}")
+
+cd "${SCRIPT_DIR}"
+"${DART}" "${VM_OPTIONS[@]}" "task_dependency_graph/generate.dart"
diff --git a/pkg/analyzer/tool/summary/idl.dart b/pkg/analyzer/tool/summary/idl.dart
new file mode 100644
index 0000000..b450499
--- /dev/null
+++ b/pkg/analyzer/tool/summary/idl.dart
@@ -0,0 +1,692 @@
+// Copyright (c) 2015, the Dart 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.
+
+/**
+ * This file is an "idl" style description of the summary format.  It is not
+ * executed directly; instead it is parsed and transformed into code that
+ * implements the summary format.
+ *
+ * The code generation process introduces the following non-typical semantics:
+ * - Fields of type List are never null, and have a default value of the empty
+ *   list.
+ * - Fields of type int are never null, and have a default value of zero.
+ * - Fields of type String are never null, and have a default value of ''.
+ * - Fields of type bool are never null, and have a default value of false.
+ * - Fields whose type is an enum are never null, and have a default value of
+ *   the first value declared in the enum.
+ *
+ * Terminology used in this document:
+ * - "Unlinked" refers to information that can be determined from reading the
+ *   .dart file for the library itself (including all parts) and no other
+ *   files.
+ * - "Prelinked" refers to information that can be determined from reading the
+ *   unlinked information for the library itself and the unlinked information
+ *   for all direct imports (plus the transitive closure of exports reachable
+ *   from those direct imports).
+ * - "Linked" refers to information that can be determined only from reading
+ *   the unlinked and prelinked information for the library itself and the
+ *   transitive closure of its imports.
+ *
+ * TODO(paulberry): currently the summary format only contains unlinked and
+ * prelinked information.
+ *
+ * Except as otherwise noted, synthetic elements are not stored in the summary;
+ * they are re-synthesized at the time the summary is read.
+ */
+library analyzer.tool.summary.idl;
+
+/**
+ * Annotation describing information which is not part of Dart semantics; in
+ * other words, if this information (or any information it refers to) changes,
+ * static analysis and runtime behavior of the library are unaffected.
+ *
+ * TODO(paulberry): some informative information is currently missing from the
+ * summary format.
+ */
+const informative = null;
+
+/**
+ * Annotation describing information which is not part of the public API to a
+ * library; in other words, if this information (or any information it refers
+ * to) changes, libraries outside this one are unaffected.
+ *
+ * TODO(paulberry): currently the summary format does not contain private
+ * information.
+ */
+const private = null;
+
+/**
+ * Information about a dependency that exists between one library and another
+ * due to an "import" declaration.
+ */
+class PrelinkedDependency {
+  /**
+   * The relative URI used to import one library from the other.
+   */
+  String uri;
+}
+
+/**
+ * Pre-linked summary of a library.
+ */
+class PrelinkedLibrary {
+  /**
+   * The unlinked library summary.
+   */
+  UnlinkedLibrary unlinked;
+
+  /**
+   * The libraries that this library depends on (either via an explicit import
+   * statement or via the implicit dependencies on `dart:core` and
+   * `dart:async`).  The first element of this array is a pseudo-dependency
+   * representing the library itself (it is also used for "dynamic").
+   *
+   * TODO(paulberry): consider removing this entirely and just using
+   * [UnlinkedLibrary.imports].
+   */
+  List<PrelinkedDependency> dependencies;
+
+  /**
+   * For each import in [UnlinkedLibrary.imports], an index into [dependencies]
+   * of the library being imported.
+   *
+   * TODO(paulberry): if [dependencies] is removed, this can be removed as
+   * well, since there will effectively be a one-to-one mapping.
+   */
+  List<int> importDependencies;
+
+  /**
+   * For each reference in [UnlinkedLibrary.references], information about how
+   * that reference is resolved.
+   */
+  List<PrelinkedReference> references;
+}
+
+/**
+ * Enum used to indicate the kind of entity referred to by a
+ * [PrelinkedReference].
+ */
+enum PrelinkedReferenceKind {
+  /**
+   * The entity is a class or enum.
+   */
+  classOrEnum,
+
+  /**
+   * The entity is a typedef.
+   */
+  typedef,
+
+  /**
+   * The entity is a variable or executable.
+   */
+  other,
+
+  /**
+   * The entity being referred to does not exist.
+   */
+  unresolved
+}
+
+/**
+ * Information about the resolution of an [UnlinkedReference].
+ */
+class PrelinkedReference {
+  /**
+   * Index into [UnlinkedLibrary.dependencies] indicating which imported library
+   * declares the entity being referred to.
+   */
+  int dependency;
+
+  /**
+   * The kind of the entity being referred to.
+   */
+  PrelinkedReferenceKind kind;
+}
+
+/**
+ * Unlinked summary information about a class declaration.
+ */
+class UnlinkedClass {
+  /**
+   * Name of the class.
+   */
+  String name;
+
+  /**
+   * Index into [UnlinkedLibrary.units] indicating which compilation unit the
+   * class is declared in.
+   */
+  @informative
+  int unit;
+
+  /**
+   * Type parameters of the class, if any.
+   */
+  List<UnlinkedTypeParam> typeParameters;
+
+  /**
+   * Supertype of the class, or `null` if either (a) the class doesn't
+   * explicitly declare a supertype (and hence has supertype `Object`), or (b)
+   * the class *is* `Object` (and hence has no supertype).
+   */
+  UnlinkedTypeRef supertype;
+
+  /**
+   * Mixins appering in a `with` clause, if any.
+   */
+  List<UnlinkedTypeRef> mixins;
+
+  /**
+   * Interfaces appearing in an `implements` clause, if any.
+   */
+  List<UnlinkedTypeRef> interfaces;
+
+  /**
+   * Field declarations contained in the class.
+   */
+  List<UnlinkedVariable> fields;
+
+  /**
+   * Executable objects (methods, getters, and setters) contained in the class.
+   */
+  List<UnlinkedExecutable> executables;
+
+  /**
+   * Indicates whether the class is declared with the `abstract` keyword.
+   */
+  bool isAbstract;
+
+  /**
+   * Indicates whether the class is declared using mixin application syntax.
+   */
+  bool isMixinApplication;
+}
+
+/**
+ * Unlinked summary information about a `show` or `hide` combinator in an
+ * import or export declaration.
+ */
+class UnlinkedCombinator {
+  /**
+   * List of names which are shown.  Empty if this is a `hide` combinator.
+   */
+  List<String> shows;
+
+  /**
+   * List of names which are hidden.  Empty if this is a `show` combinator.
+   */
+  List<String> hides;
+}
+
+/**
+ * Unlinked summary information about an enum declaration.
+ */
+class UnlinkedEnum {
+  /**
+   * Name of the enum type.
+   */
+  String name;
+
+  /**
+   * Values listed in the enum declaration, in declaration order.
+   */
+  List<UnlinkedEnumValue> values;
+
+  /**
+   * Index into [UnlinkedLibrary.units] indicating which compilation unit the
+   * enum is declared in.
+   */
+  @informative
+  int unit;
+}
+
+/**
+ * Unlinked summary information about a single enumerated value in an enum
+ * declaration.
+ */
+class UnlinkedEnumValue {
+  /**
+   * Name of the enumerated value.
+   */
+  String name;
+}
+
+/**
+ * Enum used to indicate the kind of an executable.
+ */
+enum UnlinkedExecutableKind {
+  /**
+   * Executable is a function or method.
+   */
+  functionOrMethod,
+
+  /**
+   * Executable is a getter.
+   */
+  getter,
+
+  /**
+   * Executable is a setter.
+   */
+  setter,
+
+  /**
+   * Executable is a constructor.
+   */
+  constructor
+}
+
+/**
+ * Unlinked summary information about a function, method, getter, or setter
+ * declaration.
+ */
+class UnlinkedExecutable {
+  /**
+   * Name of the executable.  For setters, this includes the trailing "=".  For
+   * named constructors, this excludes the class name and excludes the ".".
+   * For unnamed constructors, this is the empty string.
+   */
+  String name;
+
+  /**
+   * Index into [UnlinkedLibrary.units] indicating which compilation unit the
+   * executable is declared in.  Zero for executables which are nested inside
+   * another declaration (i.e. local functions and method declarations).
+   */
+  @informative
+  int unit;
+
+  /**
+   * Type parameters of the executable, if any.  Empty if support for generic
+   * method syntax is disabled.
+   */
+  List<UnlinkedTypeParam> typeParameters;
+
+  /**
+   * Declared return type of the executable.  Absent if the return type is
+   * `void`.  Note that when strong mode is enabled, the actual return type may
+   * be different due to type inference.
+   */
+  UnlinkedTypeRef returnType;
+
+  /**
+   * Parameters of the executable, if any.  Note that getters have no
+   * parameters (hence this will be the empty list), and setters have a single
+   * parameter.
+   */
+  List<UnlinkedParam> parameters;
+
+  /**
+   * The kind of the executable (function/method, getter, setter, or
+   * constructor).
+   */
+  UnlinkedExecutableKind kind;
+
+  /**
+   * Indicates whether the executable is declared using the `abstract` keyword.
+   */
+  bool isAbstract;
+
+  /**
+   * Indicates whether the executable is declared using the `static` keyword.
+   *
+   * Note that for top level executables, this flag is false, since they are
+   * not declared using the `static` keyword (even though they are considered
+   * static for semantic purposes).
+   */
+  bool isStatic;
+
+  /**
+   * Indicates whether the executable is declared using the `const` keyword.
+   */
+  bool isConst;
+
+  /**
+   * Indicates whether the executable is declared using the `factory` keyword.
+   */
+  bool isFactory;
+}
+
+/**
+ * Unlinked summary information about an export declaration.
+ */
+class UnlinkedExport {
+  /**
+   * URI used in the source code to reference the exported library.
+   */
+  String uri;
+
+  /**
+   * Combinators contained in this import declaration.
+   */
+  List<UnlinkedCombinator> combinators;
+}
+
+/**
+ * Unlinked summary information about an import declaration.
+ */
+class UnlinkedImport {
+  /**
+   * URI used in the source code to reference the imported library.
+   */
+  String uri;
+
+  /**
+   * If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
+   * is true, zero.
+   */
+  @informative
+  int offset;
+
+  /**
+   * Index into [UnlinkedLibrary.prefixes] of the prefix declared by this
+   * import declaration, or zero if this import declaration declares no prefix.
+   *
+   * Note that multiple imports can declare the same prefix.
+   */
+  int prefix;
+
+  /**
+   * Combinators contained in this import declaration.
+   */
+  List<UnlinkedCombinator> combinators;
+
+  /**
+   * Indicates whether the import declaration uses the `deferred` keyword.
+   */
+  bool isDeferred;
+
+  /**
+   * Indicates whether the import declaration is implicit.
+   */
+  bool isImplicit;
+}
+
+/**
+ * Unlinked summary of an entire library.
+ */
+class UnlinkedLibrary {
+  /**
+   * Top level and prefixed names referred to by this library.
+   */
+  List<UnlinkedReference> references;
+
+  /**
+   * Information about the units constituting this library.  The first unit
+   * listed is always the defining compilation unit.
+   */
+  List<UnlinkedUnit> units;
+
+  /**
+   * Name of the library (from a "library" declaration, if present).
+   */
+  String name;
+
+  /**
+   * Classes declared in the library.
+   */
+  List<UnlinkedClass> classes;
+
+  /**
+   * Enums declared in the library.
+   */
+  List<UnlinkedEnum> enums;
+
+  /**
+   * Top level executable objects (functions, getters, and setters) declared in
+   * the library.
+   */
+  List<UnlinkedExecutable> executables;
+
+  /**
+   * Export declarations in the library.
+   */
+  List<UnlinkedExport> exports;
+
+  /**
+   * Import declarations in the library.
+   */
+  List<UnlinkedImport> imports;
+
+  /**
+   * Typedefs declared in the library.
+   */
+  List<UnlinkedTypedef> typedefs;
+
+  /**
+   * Top level variables declared in the library.
+   */
+  List<UnlinkedVariable> variables;
+
+  /**
+   * Prefixes introduced by import declarations.  The first element in this
+   * array is a pseudo-prefix used by references made with no prefix.
+   */
+  List<UnlinkedPrefix> prefixes;
+}
+
+/**
+ * Enum used to indicate the kind of a parameter.
+ */
+enum UnlinkedParamKind {
+  /**
+   * Parameter is required.
+   */
+  required,
+
+  /**
+   * Parameter is positional optional (enclosed in `[]`)
+   */
+  positional,
+
+  /**
+   * Parameter is named optional (enclosed in `{}`)
+   */
+  named
+}
+
+/**
+ * Unlinked summary information about a function parameter.
+ */
+class UnlinkedParam {
+  /**
+   * Name of the parameter.
+   */
+  String name;
+
+  /**
+   * If [isFunctionTyped] is `true`, the declared return type.  If
+   * [isFunctionTyped] is `false`, the declared type.  Absent if
+   * [isFunctionTyped] is `true` and the declared return type is `void`.  Note
+   * that when strong mode is enabled, the actual type may be different due to
+   * type inference.
+   */
+  UnlinkedTypeRef type;
+
+  /**
+   * If [isFunctionTyped] is `true`, the parameters of the function type.
+   */
+  List<UnlinkedParam> parameters;
+
+  /**
+   * Kind of the parameter.
+   */
+  UnlinkedParamKind kind;
+
+  /**
+   * Indicates whether this is a function-typed parameter.
+   */
+  bool isFunctionTyped;
+
+  /**
+   * Indicates whether this is an initializing formal parameter (i.e. it is
+   * declared using `this.` syntax).
+   */
+  bool isInitializingFormal;
+}
+
+class UnlinkedPrefix {
+  /**
+   * The name of the prefix, or the empty string in the case of the
+   * pseudo-prefix which represents "no prefix".
+   */
+  String name;
+}
+
+/**
+ * Unlinked summary information about a name referred to in one library that
+ * might be defined in another.
+ */
+class UnlinkedReference {
+  /**
+   * Name of the entity being referred to.
+   */
+  String name;
+
+  /**
+   * Prefix used to refer to the entity.  This is an index into
+   * [UnlinkedLibrary.prefixes].
+   */
+  int prefix;
+}
+
+/**
+ * Unlinked summary information about a typedef declaration.
+ */
+class UnlinkedTypedef {
+  /**
+   * Name of the typedef.
+   */
+  String name;
+
+  /**
+   * Index into [UnlinkedLibrary.units] indicating which compilation unit the
+   * typedef is declared in.
+   */
+  @informative
+  int unit;
+
+  /**
+   * Type parameters of the typedef, if any.
+   */
+  List<UnlinkedTypeParam> typeParameters;
+
+  /**
+   * Return type of the typedef.  Absent if the return type is `void`.
+   */
+  UnlinkedTypeRef returnType;
+
+  /**
+   * Parameters of the executable, if any.
+   */
+  List<UnlinkedParam> parameters;
+}
+
+/**
+ * Unlinked summary information about a type parameter declaration.
+ */
+class UnlinkedTypeParam {
+  /**
+   * Name of the type parameter.
+   */
+  String name;
+
+  /**
+   * Bound of the type parameter, if a bound is explicitly declared.  Otherwise
+   * null.
+   */
+  UnlinkedTypeRef bound;
+}
+
+/**
+ * Unlinked summary information about a reference to a type.
+ */
+class UnlinkedTypeRef {
+  /**
+   * Index into [UnlinkedLibrary.references] for the type being referred to, or
+   * zero if this is a reference to a type parameter.
+   */
+  int reference;
+
+  /**
+   * If this is a reference to a type parameter, one-based index into
+   * [UnlinkedClass.typeParameters] or [UnlinkedTypedef.typeParameters] for the
+   * parameter being referenced.  Otherwise zero.
+   *
+   * If generic method syntax is enabled, this may also be a one-based index
+   * into [UnlinkedExecutable.typeParameters].  Note that this creates an
+   * ambiguity since it allows executables with type parameters to be nested
+   * inside other declarations with type parameters (which might themselves be
+   * executables).  The ambiguity is resolved by considering this to be a
+   * one-based index into a list that concatenates all type parameters that are
+   * in scope, listing the outermost type parameters first.
+   */
+  int paramReference;
+
+  /**
+   * If this is an instantiation of a generic type, the type arguments used to
+   * instantiate it.  Trailing type arguments of type `dynamic` are omitted.
+   */
+  List<UnlinkedTypeRef> typeArguments;
+}
+
+/**
+ * Unlinked summary information about a compilation unit ("part file").  Note
+ * that since a declaration can be moved from one part file to another without
+ * changing semantics, the declarations themselves aren't stored here; they are
+ * stored in [UnlinkedLibrary] and they refer to [UnlinkedUnit]s via an index
+ * into [UnlinkedLibrary.units].
+ */
+class UnlinkedUnit {
+  /**
+   * String used in the defining compilation unit to reference the part file.
+   * Empty for the defining compilation unit itself.
+   */
+  String uri;
+}
+
+/**
+ * Unlinked summary information about a top level variable, local variable, or
+ * a field.
+ */
+class UnlinkedVariable {
+  /**
+   * Name of the variable.
+   */
+  String name;
+
+  /**
+   * Index into [UnlinkedLibrary.units] indicating which compilation unit the
+   * variable is declared in.  Zero for variables which are nested inside
+   * another declaration (i.e. local variables and fields).
+   */
+  @informative
+  int unit;
+
+  /**
+   * Declared type of the variable.  Note that when strong mode is enabled, the
+   * actual type of the variable may be different due to type inference.
+   */
+  UnlinkedTypeRef type;
+
+  /**
+   * Indicates whether the variable is declared using the `static` keyword.
+   *
+   * Note that for top level variables, this flag is false, since they are not
+   * declared using the `static` keyword (even though they are considered
+   * static for semantic purposes).
+   */
+  bool isStatic;
+
+  /**
+   * Indicates whether the variable is declared using the `final` keyword.
+   */
+  bool isFinal;
+
+  /**
+   * Indicates whether the variable is declared using the `const` keyword.
+   */
+  bool isConst;
+}
diff --git a/pkg/analyzer/tool/task_dependency_graph.dart b/pkg/analyzer/tool/task_dependency_graph.dart
deleted file mode 100644
index 5da2976..0000000
--- a/pkg/analyzer/tool/task_dependency_graph.dart
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2015, the Dart 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.
-
-/**
- * This file contains code to output a description of tasks and their
- * dependencies in ".dot" format.  Prior to running, the user should run "pub
- * get" in the analyzer directory to ensure that a "packages" folder exists.
- *
- * The ".dot" file is output to standard out.  To convert it to a pdf, store it
- * in a file (e.g. "tasks.dot"), and post-process it with
- * "dot tasks.dart -Tpdf -O".
- *
- * TODO(paulberry):
- * - Add general.dart and html.dart for completeness.
- * - Use Graphviz's "record" feature to produce more compact output
- *   (http://www.graphviz.org/content/node-shapes#record)
- * - Produce a warning if a result descriptor is found which isn't the output
- *   of exactly one task.
- * - Convert this tool to use package_config to find the package map.
- */
-library task_dependency_graph;
-
-import 'dart:io' hide File;
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:path/path.dart' as path;
-
-main() {
-  new Driver().run();
-}
-
-typedef void ResultDescriptorFinderCallback(PropertyAccessorElement element);
-
-class Driver {
-  PhysicalResourceProvider resourceProvider;
-  AnalysisContext context;
-  InterfaceType resultDescriptorType;
-  String rootDir;
-
-  void findResultDescriptors(
-      AstNode node, void callback(String descriptorName)) {
-    Set<PropertyAccessorElement> resultDescriptors =
-        new Set<PropertyAccessorElement>();
-    node.accept(new ResultDescriptorFinder(
-        resultDescriptorType, resultDescriptors.add));
-    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
-      callback(resultDescriptor.name);
-    }
-  }
-
-  /**
-   * Find the root directory of the analyzer package by proceeding
-   * upward to the 'tool' dir, and then going up one more directory.
-   */
-  String findRoot(String pathname) {
-    while (path.basename(pathname) != 'tool') {
-      String parent = path.dirname(pathname);
-      if (parent.length >= pathname.length) {
-        throw new Exception("Can't find root directory");
-      }
-      pathname = parent;
-    }
-    return path.dirname(pathname);
-  }
-
-  CompilationUnit getUnit(Source source) =>
-      context.resolveCompilationUnit2(source, source);
-
-  void run() {
-    rootDir = findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
-    resourceProvider = PhysicalResourceProvider.INSTANCE;
-    DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
-    context = AnalysisEngine.instance.createAnalysisContext();
-    JavaFile packagesDir = new JavaFile(path.join(rootDir, 'packages'));
-    List<UriResolver> uriResolvers = [
-      new DartUriResolver(sdk),
-      new PackageUriResolver(<JavaFile>[packagesDir]),
-      new FileUriResolver()
-    ];
-    context.sourceFactory = new SourceFactory(uriResolvers);
-    Source taskSource =
-        setupSource(path.join('lib', 'src', 'task', 'dart.dart'));
-    Source modelSource = setupSource(path.join('lib', 'task', 'model.dart'));
-    CompilationUnitElement modelElement = getUnit(modelSource).element;
-    InterfaceType analysisTaskType = modelElement.getType('AnalysisTask').type;
-    DartType dynamicType = context.typeProvider.dynamicType;
-    resultDescriptorType = modelElement
-        .getType('ResultDescriptor')
-        .type
-        .substitute4([dynamicType]);
-    CompilationUnit taskUnit = getUnit(taskSource);
-    CompilationUnitElement taskUnitElement = taskUnit.element;
-    print('digraph G {');
-    Set<String> results = new Set<String>();
-    for (ClassElement cls in taskUnitElement.types) {
-      if (!cls.isAbstract && cls.type.isSubtypeOf(analysisTaskType)) {
-        String task = cls.name;
-        // TODO(paulberry): node is deprecated.  What am I supposed to do
-        // instead?
-        findResultDescriptors(cls.getMethod('buildInputs').node,
-            (String input) {
-          results.add(input);
-          print('  $input -> $task');
-        });
-        findResultDescriptors(cls.getField('DESCRIPTOR').node, (String output) {
-          results.add(output);
-          print('  $task -> $output');
-        });
-      }
-    }
-    for (String result in results) {
-      print('  $result [shape=box]');
-    }
-    print('}');
-  }
-
-  Source setupSource(String filename) {
-    String filePath = path.join(rootDir, filename);
-    File file = resourceProvider.getResource(filePath);
-    Source source = file.createSource();
-    Uri restoredUri = context.sourceFactory.restoreUri(source);
-    if (restoredUri != null) {
-      source = file.createSource(restoredUri);
-    }
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(source);
-    context.applyChanges(changeSet);
-    return source;
-  }
-}
-
-class ResultDescriptorFinder extends GeneralizingAstVisitor {
-  final InterfaceType resultDescriptorType;
-  final ResultDescriptorFinderCallback callback;
-
-  ResultDescriptorFinder(this.resultDescriptorType, this.callback);
-
-  @override
-  visitIdentifier(Identifier node) {
-    Element element = node.staticElement;
-    if (element is PropertyAccessorElement &&
-        element.isGetter &&
-        element.returnType.isSubtypeOf(resultDescriptorType)) {
-      callback(element);
-    }
-  }
-}
diff --git a/pkg/analyzer/tool/task_dependency_graph/check_test.dart b/pkg/analyzer/tool/task_dependency_graph/check_test.dart
new file mode 100644
index 0000000..a2d1118
--- /dev/null
+++ b/pkg/analyzer/tool/task_dependency_graph/check_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2015, the Dart 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.
+
+library task_dependency_graph.check_test;
+
+import 'dart:io';
+
+import 'package:path/path.dart';
+
+import 'generate.dart';
+
+/**
+ * Check that the target file has been code generated.  If it hasn't tell the
+ * user to run generate.dart.
+ */
+main() {
+  String script = Platform.script.toFilePath(windows: Platform.isWindows);
+  Driver driver = new Driver();
+  if (!driver.checkFile()) {
+    print('${driver.file.absolute} does not have expected contents.');
+    print('Please regenerate using:');
+    String executable = Platform.executable;
+    String packageRoot = '';
+    if (Platform.packageRoot.isNotEmpty) {
+      packageRoot = ' --package-root=${Platform.packageRoot}';
+    }
+    String generateScript = join(dirname(script), 'generate.dart');
+    print('  $executable$packageRoot $generateScript');
+    exit(1);
+  } else {
+    print('Generated file is up to date.');
+  }
+}
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
new file mode 100644
index 0000000..a98eaba
--- /dev/null
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -0,0 +1,347 @@
+// Copyright (c) 2015, the Dart 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.
+
+/**
+ * This file contains code to output a description of tasks and their
+ * dependencies in ".dot" format.  Prior to running, the user should run "pub
+ * get" in the analyzer directory to ensure that a "packages" folder exists.
+ *
+ * TODO(paulberry):
+ * - Add general.dart and html.dart for completeness.
+ * - Use Graphviz's "record" feature to produce more compact output
+ *   (http://www.graphviz.org/content/node-shapes#record)
+ * - Produce a warning if a result descriptor is found which isn't the output
+ *   of exactly one task.
+ * - Convert this tool to use package_config to find the package map.
+ */
+library task_dependency_graph.generate;
+
+import 'dart:io' hide File;
+import 'dart:io' as io;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart' as path;
+
+/**
+ * Generate the target .dot file.
+ */
+main() {
+  new Driver().generateFile();
+}
+
+typedef void GetterFinderCallback(PropertyAccessorElement element);
+
+class Driver {
+  PhysicalResourceProvider resourceProvider;
+  AnalysisContext context;
+  InterfaceType resultDescriptorType;
+  InterfaceType listOfResultDescriptorType;
+  ClassElement enginePluginClass;
+  CompilationUnitElement taskUnitElement;
+  InterfaceType extensionPointIdType;
+  final String rootDir;
+
+  Driver()
+      : rootDir =
+            findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
+
+  /**
+   * Get an [io.File] object corresponding to the file in which the generated
+   * graph should be output.
+   */
+  io.File get file => new io.File(
+      path.join(rootDir, 'tool', 'task_dependency_graph', 'tasks.dot'));
+
+  /**
+   * Determine if the output [file] contains the expected contents.
+   */
+  bool checkFile() {
+    String expectedContents = generateFileContents();
+    String actualContents = file.readAsStringSync();
+    // Normalize Windows line endings to Unix line endings so that the
+    // comparison doesn't fail on Windows.
+    actualContents = actualContents.replaceAll('\r\n', '\n');
+    return expectedContents == actualContents;
+  }
+
+  /**
+   * Starting at [node], find all calls to registerExtension() which refer to
+   * the given [extensionIdVariable], and execute [callback] for the associated
+   * result descriptors.
+   */
+  void findExtensions(AstNode node, TopLevelVariableElement extensionIdVariable,
+      void callback(descriptorName)) {
+    Set<PropertyAccessorElement> resultDescriptors =
+        new Set<PropertyAccessorElement>();
+    node.accept(new ExtensionFinder(
+        resultDescriptorType, extensionIdVariable, resultDescriptors.add));
+    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
+      callback(resultDescriptor.name);
+    }
+  }
+
+  /**
+   * Starting at [node], find all references to a getter of type
+   * `List<ResultDescriptor>`, and execute [callback] on the getter names.
+   */
+  void findResultDescriptorLists(
+      AstNode node, void callback(String descriptorListName)) {
+    Set<PropertyAccessorElement> resultDescriptorLists =
+        new Set<PropertyAccessorElement>();
+    node.accept(new GetterFinder(
+        listOfResultDescriptorType, resultDescriptorLists.add));
+    for (PropertyAccessorElement resultDescriptorList
+        in resultDescriptorLists) {
+      // We only care about result descriptor lists associated with getters in
+      // the engine plugin class.
+      if (resultDescriptorList.enclosingElement != enginePluginClass) {
+        continue;
+      }
+      callback(resultDescriptorList.name);
+    }
+  }
+
+  void findResultDescriptors(
+      AstNode node, void callback(String descriptorName)) {
+    Set<PropertyAccessorElement> resultDescriptors =
+        new Set<PropertyAccessorElement>();
+    node.accept(new GetterFinder(resultDescriptorType, resultDescriptors.add));
+    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
+      callback(resultDescriptor.name);
+    }
+  }
+
+  /**
+   * Generate the task dependency graph and write it to the output [file].
+   */
+  void generateFile() {
+    String fileContents = generateFileContents();
+    file.writeAsStringSync(fileContents);
+  }
+
+  /**
+   * Generate the task dependency graph and return it as a [String].
+   */
+  String generateFileContents() {
+    List<String> lines = <String>[];
+    resourceProvider = PhysicalResourceProvider.INSTANCE;
+    DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
+    context = AnalysisEngine.instance.createAnalysisContext();
+    String packageRootPath;
+    if (Platform.packageRoot.isNotEmpty) {
+      packageRootPath = Platform.packageRoot;
+    } else {
+      packageRootPath = path.join(rootDir, 'packages');
+    }
+    JavaFile packagesDir = new JavaFile(packageRootPath);
+    List<UriResolver> uriResolvers = [
+      new DartUriResolver(sdk),
+      new PackageUriResolver(<JavaFile>[packagesDir]),
+      new FileUriResolver()
+    ];
+    context.sourceFactory = new SourceFactory(uriResolvers);
+    Source dartDartSource =
+        setupSource(path.join('lib', 'src', 'task', 'dart.dart'));
+    Source taskSource = setupSource(path.join('lib', 'plugin', 'task.dart'));
+    Source modelSource = setupSource(path.join('lib', 'task', 'model.dart'));
+    Source enginePluginSource =
+        setupSource(path.join('lib', 'src', 'plugin', 'engine_plugin.dart'));
+    CompilationUnitElement modelElement = getUnit(modelSource).element;
+    InterfaceType analysisTaskType = modelElement.getType('AnalysisTask').type;
+    DartType dynamicType = context.typeProvider.dynamicType;
+    resultDescriptorType = modelElement
+        .getType('ResultDescriptor')
+        .type
+        .substitute4([dynamicType]);
+    listOfResultDescriptorType =
+        context.typeProvider.listType.substitute4([resultDescriptorType]);
+    CompilationUnitElement enginePluginUnitElement =
+        getUnit(enginePluginSource).element;
+    enginePluginClass = enginePluginUnitElement.getType('EnginePlugin');
+    extensionPointIdType =
+        enginePluginUnitElement.getType('ExtensionPointId').type;
+    CompilationUnit dartDartUnit = getUnit(dartDartSource);
+    CompilationUnitElement dartDartUnitElement = dartDartUnit.element;
+    CompilationUnit taskUnit = getUnit(taskSource);
+    taskUnitElement = taskUnit.element;
+    Set<String> results = new Set<String>();
+    Set<String> resultLists = new Set<String>();
+    for (ClassElement cls in dartDartUnitElement.types) {
+      if (!cls.isAbstract && cls.type.isSubtypeOf(analysisTaskType)) {
+        String task = cls.name;
+        AstNode buildInputsAst = cls.getMethod('buildInputs').computeNode();
+        findResultDescriptors(buildInputsAst, (String input) {
+          results.add(input);
+          lines.add('  $input -> $task');
+        });
+        findResultDescriptorLists(buildInputsAst, (String input) {
+          resultLists.add(input);
+          lines.add('  $input -> $task');
+        });
+        findResultDescriptors(cls.getField('DESCRIPTOR').computeNode(),
+            (String out) {
+          results.add(out);
+          lines.add('  $task -> $out');
+        });
+      }
+    }
+    AstNode enginePluginAst = enginePluginUnitElement.computeNode();
+    for (String resultList in resultLists) {
+      lines.add('  $resultList [shape=hexagon]');
+      TopLevelVariableElement extensionIdVariable = _getExtensionId(resultList);
+      findExtensions(enginePluginAst, extensionIdVariable, (String extension) {
+        results.add(extension);
+        lines.add('  $extension -> $resultList');
+      });
+    }
+    for (String result in results) {
+      lines.add('  $result [shape=box]');
+    }
+    lines.sort();
+    return '''
+// Copyright (c) 2015, the Dart 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.
+//
+// This file has been automatically generated.  Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
+//
+// To render this graph using Graphviz (www.graphviz.org) use the command:
+// "dot tasks.dot -Tpdf -O".
+digraph G {
+${lines.join('\n')}
+}
+''';
+  }
+
+  CompilationUnit getUnit(Source source) =>
+      context.resolveCompilationUnit2(source, source);
+
+  Source setupSource(String filename) {
+    String filePath = path.join(rootDir, filename);
+    File file = resourceProvider.getResource(filePath);
+    Source source = file.createSource();
+    Uri restoredUri = context.sourceFactory.restoreUri(source);
+    if (restoredUri != null) {
+      source = file.createSource(restoredUri);
+    }
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Find the result list getter having name [resultListGetterName] in the
+   * [EnginePlugin] class, and use the [ExtensionPointId] annotation on that
+   * getter to find the associated [TopLevelVariableElement] which can be used
+   * to register extensions for that getter.
+   */
+  TopLevelVariableElement _getExtensionId(String resultListGetterName) {
+    PropertyAccessorElement getter =
+        enginePluginClass.getGetter(resultListGetterName);
+    for (ElementAnnotation annotation in getter.metadata) {
+      DartObjectImpl annotationValue = annotation.constantValue;
+      if (annotationValue.type.isSubtypeOf(extensionPointIdType)) {
+        String extensionPointId =
+            annotationValue.fields['extensionPointId'].toStringValue();
+        for (TopLevelVariableElement variable
+            in taskUnitElement.topLevelVariables) {
+          if (variable.name == extensionPointId) {
+            return variable;
+          }
+        }
+      }
+    }
+    throw new Exception(
+        'Could not find extension ID corresponding to $resultListGetterName');
+  }
+
+  /**
+   * Find the root directory of the analyzer package by proceeding
+   * upward to the 'tool' dir, and then going up one more directory.
+   */
+  static String findRoot(String pathname) {
+    while (path.basename(pathname) != 'tool') {
+      String parent = path.dirname(pathname);
+      if (parent.length >= pathname.length) {
+        throw new Exception("Can't find root directory");
+      }
+      pathname = parent;
+    }
+    return path.dirname(pathname);
+  }
+}
+
+/**
+ * Visitor that finds calls that register extension points.  Specifically, we
+ * look for calls of the form `method(extensionIdVariable, resultDescriptor)`,
+ * where `resultDescriptor` has type [resultDescriptorType], and we pass the
+ * corresponding result descriptor names to [callback].
+ */
+class ExtensionFinder extends GeneralizingAstVisitor {
+  final InterfaceType resultDescriptorType;
+  final TopLevelVariableElement extensionIdVariable;
+  final GetterFinderCallback callback;
+
+  ExtensionFinder(
+      this.resultDescriptorType, this.extensionIdVariable, this.callback);
+
+  @override
+  visitIdentifier(Identifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement &&
+        element.isGetter &&
+        element.variable == extensionIdVariable) {
+      AstNode parent = node.parent;
+      if (parent is ArgumentList &&
+          parent.arguments.length == 2 &&
+          parent.arguments[0] == node) {
+        Expression extension = parent.arguments[1];
+        if (extension is Identifier) {
+          Element element = extension.staticElement;
+          if (element is PropertyAccessorElement &&
+              element.isGetter &&
+              element.returnType.isSubtypeOf(resultDescriptorType)) {
+            callback(element);
+            return;
+          }
+        }
+      }
+      throw new Exception('Could not decode extension setup: $parent');
+    }
+  }
+}
+
+/**
+ * Visitor that finds references to getters having a specific type (or a
+ * subtype of that type)
+ */
+class GetterFinder extends GeneralizingAstVisitor {
+  final InterfaceType type;
+  final GetterFinderCallback callback;
+
+  GetterFinder(this.type, this.callback);
+
+  @override
+  visitIdentifier(Identifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement &&
+        element.isGetter &&
+        element.returnType.isSubtypeOf(type)) {
+      callback(element);
+    }
+  }
+}
diff --git a/pkg/analyzer/tool/task_dependency_graph/tasks.dot b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
new file mode 100644
index 0000000..4e915c8
--- /dev/null
+++ b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
@@ -0,0 +1,274 @@
+// Copyright (c) 2015, the Dart 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.
+//
+// This file has been automatically generated.  Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
+//
+// To render this graph using Graphviz (www.graphviz.org) use the command:
+// "dot tasks.dot -Tpdf -O".
+digraph G {
+  BUILD_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
+  BUILD_DIRECTIVES_ERRORS [shape=box]
+  BUILD_LIBRARY_ERRORS -> LibraryUnitErrorsTask
+  BUILD_LIBRARY_ERRORS [shape=box]
+  BuildCompilationUnitElementTask -> COMPILATION_UNIT_CONSTANTS
+  BuildCompilationUnitElementTask -> COMPILATION_UNIT_ELEMENT
+  BuildCompilationUnitElementTask -> RESOLVED_UNIT1
+  BuildDirectiveElementsTask -> BUILD_DIRECTIVES_ERRORS
+  BuildDirectiveElementsTask -> LIBRARY_ELEMENT2
+  BuildEnumMemberElementsTask -> RESOLVED_UNIT2
+  BuildExportNamespaceTask -> LIBRARY_ELEMENT4
+  BuildLibraryElementTask -> BUILD_LIBRARY_ERRORS
+  BuildLibraryElementTask -> IS_LAUNCHABLE
+  BuildLibraryElementTask -> LIBRARY_ELEMENT1
+  BuildPublicNamespaceTask -> LIBRARY_ELEMENT3
+  BuildSourceExportClosureTask -> EXPORT_SOURCE_CLOSURE
+  BuildTypeProviderTask -> TYPE_PROVIDER
+  COMPILATION_UNIT_CONSTANTS -> EvaluateUnitConstantsTask
+  COMPILATION_UNIT_CONSTANTS [shape=box]
+  COMPILATION_UNIT_ELEMENT [shape=box]
+  CONSTANT_DEPENDENCIES -> ComputeConstantValueTask
+  CONSTANT_DEPENDENCIES [shape=box]
+  CONSTANT_VALUE -> ComputeConstantValueTask
+  CONSTANT_VALUE -> EvaluateUnitConstantsTask
+  CONSTANT_VALUE [shape=box]
+  CONTAINING_LIBRARIES -> DartErrorsTask
+  CONTAINING_LIBRARIES [shape=box]
+  CONTENT -> ScanDartTask
+  CONTENT [shape=box]
+  ComputeConstantDependenciesTask -> CONSTANT_DEPENDENCIES
+  ComputeConstantValueTask -> CONSTANT_VALUE
+  ComputeInferableStaticVariableDependenciesTask -> INFERABLE_STATIC_VARIABLE_DEPENDENCIES
+  ComputeLibraryCycleTask -> LIBRARY_CYCLE
+  ComputeLibraryCycleTask -> LIBRARY_CYCLE_DEPENDENCIES
+  ComputeLibraryCycleTask -> LIBRARY_CYCLE_UNITS
+  ContainingLibrariesTask -> CONTAINING_LIBRARIES
+  DART_ERRORS -> LibraryErrorsReadyTask
+  DART_ERRORS [shape=box]
+  DART_SCRIPTS -> ScanDartTask
+  DART_SCRIPTS [shape=box]
+  DartErrorsTask -> DART_ERRORS
+  EXPLICITLY_IMPORTED_LIBRARIES [shape=box]
+  EXPORTED_LIBRARIES -> BuildDirectiveElementsTask
+  EXPORTED_LIBRARIES -> ReadyLibraryElement2Task
+  EXPORTED_LIBRARIES -> ReadyLibraryElement5Task
+  EXPORTED_LIBRARIES -> ReadyResolvedUnit10Task
+  EXPORTED_LIBRARIES -> ReadyResolvedUnit9Task
+  EXPORTED_LIBRARIES -> ReadyResolvedUnitTask
+  EXPORTED_LIBRARIES [shape=box]
+  EXPORT_SOURCE_CLOSURE -> BuildExportNamespaceTask
+  EXPORT_SOURCE_CLOSURE [shape=box]
+  EvaluateUnitConstantsTask -> RESOLVED_UNIT10
+  GatherUsedImportedElementsTask -> USED_IMPORTED_ELEMENTS
+  GatherUsedLocalElementsTask -> USED_LOCAL_ELEMENTS
+  GenerateHintsTask -> HINTS
+  GenerateLintsTask -> LINTS
+  HINTS -> LibraryUnitErrorsTask
+  HINTS [shape=box]
+  IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
+  IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
+  IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
+  IMPORTED_LIBRARIES -> ReadyResolvedUnit10Task
+  IMPORTED_LIBRARIES -> ReadyResolvedUnit9Task
+  IMPORTED_LIBRARIES -> ReadyResolvedUnitTask
+  IMPORTED_LIBRARIES -> ResolveUnitTypeNamesTask
+  IMPORTED_LIBRARIES [shape=box]
+  INCLUDED_PARTS -> BuildLibraryElementTask
+  INCLUDED_PARTS [shape=box]
+  INFERABLE_STATIC_VARIABLES_IN_UNIT -> InferStaticVariableTypesInUnitTask
+  INFERABLE_STATIC_VARIABLES_IN_UNIT [shape=box]
+  INFERABLE_STATIC_VARIABLE_DEPENDENCIES -> InferStaticVariableTypeTask
+  INFERABLE_STATIC_VARIABLE_DEPENDENCIES [shape=box]
+  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypeTask
+  INFERRED_STATIC_VARIABLE -> InferStaticVariableTypesInUnitTask
+  INFERRED_STATIC_VARIABLE [shape=box]
+  IS_LAUNCHABLE [shape=box]
+  InferInstanceMembersInUnitTask -> RESOLVED_UNIT8
+  InferStaticVariableTypeTask -> INFERRED_STATIC_VARIABLE
+  InferStaticVariableTypesInUnitTask -> RESOLVED_UNIT6
+  LIBRARY_CYCLE [shape=box]
+  LIBRARY_CYCLE_DEPENDENCIES -> InferInstanceMembersInUnitTask
+  LIBRARY_CYCLE_DEPENDENCIES -> InferStaticVariableTypeTask
+  LIBRARY_CYCLE_DEPENDENCIES -> PartiallyResolveUnitReferencesTask
+  LIBRARY_CYCLE_DEPENDENCIES -> ResolveInstanceFieldsInUnitTask
+  LIBRARY_CYCLE_DEPENDENCIES [shape=box]
+  LIBRARY_CYCLE_UNITS -> InferInstanceMembersInUnitTask
+  LIBRARY_CYCLE_UNITS -> ResolveInstanceFieldsInUnitTask
+  LIBRARY_CYCLE_UNITS -> ResolveUnitTask
+  LIBRARY_CYCLE_UNITS [shape=box]
+  LIBRARY_ELEMENT -> EvaluateUnitConstantsTask
+  LIBRARY_ELEMENT [shape=box]
+  LIBRARY_ELEMENT1 -> BuildDirectiveElementsTask
+  LIBRARY_ELEMENT1 -> ResolveVariableReferencesTask
+  LIBRARY_ELEMENT1 [shape=box]
+  LIBRARY_ELEMENT2 -> BuildPublicNamespaceTask
+  LIBRARY_ELEMENT2 -> BuildSourceExportClosureTask
+  LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
+  LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
+  LIBRARY_ELEMENT2 [shape=box]
+  LIBRARY_ELEMENT3 -> BuildExportNamespaceTask
+  LIBRARY_ELEMENT3 -> BuildTypeProviderTask
+  LIBRARY_ELEMENT3 [shape=box]
+  LIBRARY_ELEMENT4 -> ResolveLibraryTypeNamesTask
+  LIBRARY_ELEMENT4 -> ResolveUnitTypeNamesTask
+  LIBRARY_ELEMENT4 [shape=box]
+  LIBRARY_ELEMENT5 -> PartiallyResolveUnitReferencesTask
+  LIBRARY_ELEMENT5 -> ReadyLibraryElement5Task
+  LIBRARY_ELEMENT5 -> ResolveInstanceFieldsInUnitTask
+  LIBRARY_ELEMENT5 -> ResolveLibraryReferencesTask
+  LIBRARY_ELEMENT5 -> ResolveUnitTask
+  LIBRARY_ELEMENT5 [shape=box]
+  LIBRARY_ERRORS_READY [shape=box]
+  LIBRARY_SPECIFIC_UNITS -> GenerateHintsTask
+  LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnit10Task
+  LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnit9Task
+  LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnitTask
+  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryReferencesTask
+  LIBRARY_SPECIFIC_UNITS -> ResolveLibraryTypeNamesTask
+  LIBRARY_SPECIFIC_UNITS [shape=box]
+  LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
+  LIBRARY_UNIT_ERRORS [shape=box]
+  LINE_INFO -> ParseDartTask
+  LINE_INFO [shape=box]
+  LINTS -> LibraryUnitErrorsTask
+  LINTS [shape=box]
+  LibraryErrorsReadyTask -> LIBRARY_ERRORS_READY
+  LibraryUnitErrorsTask -> LIBRARY_UNIT_ERRORS
+  MODIFICATION_TIME -> ParseDartTask
+  MODIFICATION_TIME [shape=box]
+  PARSED_UNIT -> BuildCompilationUnitElementTask
+  PARSED_UNIT [shape=box]
+  PARSE_ERRORS -> dartErrorsForSource
+  PARSE_ERRORS [shape=box]
+  ParseDartTask -> EXPLICITLY_IMPORTED_LIBRARIES
+  ParseDartTask -> EXPORTED_LIBRARIES
+  ParseDartTask -> IMPORTED_LIBRARIES
+  ParseDartTask -> INCLUDED_PARTS
+  ParseDartTask -> LIBRARY_SPECIFIC_UNITS
+  ParseDartTask -> PARSED_UNIT
+  ParseDartTask -> PARSE_ERRORS
+  ParseDartTask -> SOURCE_KIND
+  ParseDartTask -> UNITS
+  PartiallyResolveUnitReferencesTask -> INFERABLE_STATIC_VARIABLES_IN_UNIT
+  PartiallyResolveUnitReferencesTask -> RESOLVED_UNIT5
+  READY_LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
+  READY_LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
+  READY_LIBRARY_ELEMENT2 [shape=box]
+  READY_LIBRARY_ELEMENT5 -> PartiallyResolveUnitReferencesTask
+  READY_LIBRARY_ELEMENT5 -> ReadyLibraryElement5Task
+  READY_LIBRARY_ELEMENT5 [shape=box]
+  READY_RESOLVED_UNIT -> ReadyResolvedUnitTask
+  READY_RESOLVED_UNIT -> VerifyUnitTask
+  READY_RESOLVED_UNIT [shape=box]
+  READY_RESOLVED_UNIT10 -> ReadyResolvedUnit10Task
+  READY_RESOLVED_UNIT10 -> StrongModeVerifyUnitTask
+  READY_RESOLVED_UNIT10 [shape=box]
+  READY_RESOLVED_UNIT9 -> ReadyResolvedUnit9Task
+  READY_RESOLVED_UNIT9 -> ResolveLibraryReferencesTask
+  READY_RESOLVED_UNIT9 [shape=box]
+  REFERENCED_NAMES [shape=box]
+  RESOLVED_UNIT -> GenerateHintsTask
+  RESOLVED_UNIT -> GenerateLintsTask
+  RESOLVED_UNIT -> ReadyResolvedUnitTask
+  RESOLVED_UNIT -> VerifyUnitTask
+  RESOLVED_UNIT [shape=box]
+  RESOLVED_UNIT1 -> BuildDirectiveElementsTask
+  RESOLVED_UNIT1 -> BuildEnumMemberElementsTask
+  RESOLVED_UNIT1 -> BuildLibraryElementTask
+  RESOLVED_UNIT1 [shape=box]
+  RESOLVED_UNIT10 -> ReadyResolvedUnit10Task
+  RESOLVED_UNIT10 -> StrongModeVerifyUnitTask
+  RESOLVED_UNIT10 [shape=box]
+  RESOLVED_UNIT2 -> ResolveUnitTypeNamesTask
+  RESOLVED_UNIT2 [shape=box]
+  RESOLVED_UNIT3 -> ResolveLibraryTypeNamesTask
+  RESOLVED_UNIT3 -> ResolveVariableReferencesTask
+  RESOLVED_UNIT3 [shape=box]
+  RESOLVED_UNIT4 -> PartiallyResolveUnitReferencesTask
+  RESOLVED_UNIT4 [shape=box]
+  RESOLVED_UNIT5 -> ComputeInferableStaticVariableDependenciesTask
+  RESOLVED_UNIT5 -> InferStaticVariableTypeTask
+  RESOLVED_UNIT5 -> InferStaticVariableTypesInUnitTask
+  RESOLVED_UNIT5 [shape=box]
+  RESOLVED_UNIT6 -> ResolveInstanceFieldsInUnitTask
+  RESOLVED_UNIT6 [shape=box]
+  RESOLVED_UNIT7 -> InferInstanceMembersInUnitTask
+  RESOLVED_UNIT7 [shape=box]
+  RESOLVED_UNIT8 -> InferInstanceMembersInUnitTask
+  RESOLVED_UNIT8 -> InferStaticVariableTypeTask
+  RESOLVED_UNIT8 -> PartiallyResolveUnitReferencesTask
+  RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
+  RESOLVED_UNIT8 -> ResolveUnitTask
+  RESOLVED_UNIT8 [shape=box]
+  RESOLVED_UNIT9 -> ComputeConstantDependenciesTask
+  RESOLVED_UNIT9 -> EvaluateUnitConstantsTask
+  RESOLVED_UNIT9 -> GatherUsedImportedElementsTask
+  RESOLVED_UNIT9 -> GatherUsedLocalElementsTask
+  RESOLVED_UNIT9 -> ReadyResolvedUnit9Task
+  RESOLVED_UNIT9 -> ResolveLibraryReferencesTask
+  RESOLVED_UNIT9 [shape=box]
+  RESOLVE_TYPE_NAMES_ERRORS -> LibraryUnitErrorsTask
+  RESOLVE_TYPE_NAMES_ERRORS [shape=box]
+  RESOLVE_UNIT_ERRORS -> LibraryUnitErrorsTask
+  RESOLVE_UNIT_ERRORS [shape=box]
+  ReadyLibraryElement2Task -> READY_LIBRARY_ELEMENT2
+  ReadyLibraryElement5Task -> READY_LIBRARY_ELEMENT5
+  ReadyResolvedUnit10Task -> READY_RESOLVED_UNIT10
+  ReadyResolvedUnit9Task -> READY_RESOLVED_UNIT9
+  ReadyResolvedUnitTask -> READY_RESOLVED_UNIT
+  ResolveInstanceFieldsInUnitTask -> RESOLVED_UNIT7
+  ResolveLibraryReferencesTask -> LIBRARY_ELEMENT
+  ResolveLibraryReferencesTask -> REFERENCED_NAMES
+  ResolveLibraryTypeNamesTask -> LIBRARY_ELEMENT5
+  ResolveUnitTask -> RESOLVED_UNIT9
+  ResolveUnitTask -> RESOLVE_UNIT_ERRORS
+  ResolveUnitTypeNamesTask -> RESOLVED_UNIT3
+  ResolveUnitTypeNamesTask -> RESOLVE_TYPE_NAMES_ERRORS
+  ResolveVariableReferencesTask -> RESOLVED_UNIT4
+  ResolveVariableReferencesTask -> VARIABLE_REFERENCE_ERRORS
+  SCAN_ERRORS -> dartErrorsForSource
+  SCAN_ERRORS [shape=box]
+  SOURCE_KIND -> BuildDirectiveElementsTask
+  SOURCE_KIND [shape=box]
+  STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
+  STRONG_MODE_ERRORS [shape=box]
+  ScanDartTask -> LINE_INFO
+  ScanDartTask -> SCAN_ERRORS
+  ScanDartTask -> TOKEN_STREAM
+  StrongModeVerifyUnitTask -> RESOLVED_UNIT
+  StrongModeVerifyUnitTask -> STRONG_MODE_ERRORS
+  TOKEN_STREAM -> ParseDartTask
+  TOKEN_STREAM [shape=box]
+  TYPE_PROVIDER -> BuildEnumMemberElementsTask
+  TYPE_PROVIDER -> ComputeConstantDependenciesTask
+  TYPE_PROVIDER -> ComputeConstantValueTask
+  TYPE_PROVIDER -> GenerateHintsTask
+  TYPE_PROVIDER -> InferInstanceMembersInUnitTask
+  TYPE_PROVIDER -> InferStaticVariableTypeTask
+  TYPE_PROVIDER -> PartiallyResolveUnitReferencesTask
+  TYPE_PROVIDER -> ResolveInstanceFieldsInUnitTask
+  TYPE_PROVIDER -> ResolveLibraryTypeNamesTask
+  TYPE_PROVIDER -> ResolveUnitTask
+  TYPE_PROVIDER -> ResolveUnitTypeNamesTask
+  TYPE_PROVIDER -> ResolveVariableReferencesTask
+  TYPE_PROVIDER -> StrongModeVerifyUnitTask
+  TYPE_PROVIDER -> VerifyUnitTask
+  TYPE_PROVIDER [shape=box]
+  UNITS -> LibraryErrorsReadyTask
+  UNITS [shape=box]
+  USED_IMPORTED_ELEMENTS -> GenerateHintsTask
+  USED_IMPORTED_ELEMENTS [shape=box]
+  USED_LOCAL_ELEMENTS -> GenerateHintsTask
+  USED_LOCAL_ELEMENTS [shape=box]
+  VARIABLE_REFERENCE_ERRORS -> LibraryUnitErrorsTask
+  VARIABLE_REFERENCE_ERRORS [shape=box]
+  VERIFY_ERRORS -> LibraryUnitErrorsTask
+  VERIFY_ERRORS [shape=box]
+  VerifyUnitTask -> VERIFY_ERRORS
+  dartErrorsForSource -> DartErrorsTask
+  dartErrorsForSource [shape=hexagon]
+  dartErrorsForUnit -> DartErrorsTask
+  dartErrorsForUnit [shape=hexagon]
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 674f7eb..e9c99b2 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -143,6 +143,7 @@
 analysis_server/test/*: SkipByDesign # Uses dart:io.
 analysis_server/tool/spec/check_all_test: SkipByDesign # Uses dart:io.
 analyzer/test/*: SkipByDesign # Uses dart:io.
+analyzer/tool/task_dependency_graph/check_test: SkipByDesign # Uses dart:io.
 analyzer2dart/*: SkipByDesign # Uses dart:io.
 http_server/test/*: Fail, OK # Uses dart:io.
 observe/test/transformer_test: Fail, OK # Uses dart:io.
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 7c9ee75..232d8db 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -1622,9 +1622,9 @@
    *                 onDone: controller.close,
    *                 cancelOnError: cancelOnError);
    *             },
-   *             onPause: subscription.pause,
-   *             onResume: subscription.resume,
-   *             onCancel: subscription.cancel,
+   *             onPause: () => subscription.pause(),
+   *             onResume: () => subscription.resume(),
+   *             onCancel: () => subscription.cancel(),
    *             sync: true);
    *           return controller.stream.listen(null);
    *         });
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index 64a63e6..77f7158 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -310,10 +310,6 @@
   List<int> convert(String input) {
     if (input.isEmpty) return new Uint8List(0);
     int length = input.length;
-    if (length % 4 != 0) {
-      throw new FormatException("Invalid length, must be multiple of four",
-                                input, length);
-    }
     var decoder = new _Base64Decoder();
     Uint8List buffer = decoder.decode(input, 0, input.length);
     decoder.close(input, input.length);
@@ -350,18 +346,28 @@
    *
    * Uses [_invalid] for invalid indices and [_padding] for the padding
    * character.
+   *
+   * Accepts the "URL-safe" alphabet as well (`-` and `_` are the
+   * 62nd and 63rd alphabet characters), and considers `%` a padding
+   * character which mush be followed by `3D`, the percent-escape
+   * for `=`.
    */
   static final List<int> _inverseAlphabet = new Int8List.fromList([
     __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
-    __, __, __, __, __, __, __, __, __, __, __, 62, __, __, __, 63,
+    __, __, __, __, __, _p, __, __, __, __, __, 62, __, 62, __, 63,
     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, __, __, __, _p, __, __,
     __,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, __,
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, 63,
     __, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, __, __, __, __,
   ]);
 
+  // Character constants.
+  static const int _char_percent = 0x25;  // '%'.
+  static const int _char_3       = 0x33;  // '3'.
+  static const int _char_d       = 0x64;  // 'd'.
+
   /**
    * Maintains the intermediate state of a partly-decoded input.
    *
@@ -412,7 +418,7 @@
    */
   static int _encodePaddingState(int expectedPadding) {
     assert(expectedPadding >= 0);
-    assert(expectedPadding <= 1);
+    assert(expectedPadding <= 5);
     return -expectedPadding - 1;  // ~expectedPadding adapted to dart2js.
   }
 
@@ -498,6 +504,7 @@
         }
         continue;
       } else if (code == _padding && count > 1) {
+        if (charOr < 0 || charOr > asciiMax) break;
         if (count == 3) {
           if ((bits & 0x03) != 0) {
             throw new FormatException(
@@ -512,7 +519,13 @@
           }
           output[outIndex++] = bits >> 4;
         }
-        int expectedPadding = 3 - count;
+        // Expected padding is the number of expected padding characters,
+        // where `=` counts as three and `%3D` counts as one per character.
+        //
+        // Expect either zero or one padding depending on count (2 or 3),
+        // plus two more characters if the code was `%` (a partial padding).
+        int expectedPadding = (3 - count) * 3;
+        if (char == _char_percent) expectedPadding += 2;
         state = _encodePaddingState(expectedPadding);
         return _checkPadding(input, i + 1, end, state);
       }
@@ -538,53 +551,134 @@
   static Uint8List _allocateBuffer(String input, int start, int end,
                                    int state) {
     assert(state >= 0);
-    int padding = 0;
-    int length = _stateCount(state) + (end - start);
-    if (end > start && input.codeUnitAt(end - 1) == _paddingChar) {
-      padding++;
-      if (end - 1 > start && input.codeUnitAt(end - 2) == _paddingChar) {
-        padding++;
-      }
-    }
+    int paddingStart = _trimPaddingChars(input, start, end);
+    int length = _stateCount(state) + (paddingStart - start);
     // Three bytes per full four bytes in the input.
     int bufferLength = (length >> 2) * 3;
-    // If padding was seen, then remove the padding if it was counter, or
-    // add the last partial chunk it it wasn't counted.
+    // If padding was seen, then this is the last chunk, and the final partial
+    // chunk should be decoded too.
     int remainderLength = length & 3;
-    if (remainderLength == 0) {
-      bufferLength -= padding;
-    } else if (padding != 0 && remainderLength - padding > 1) {
-      bufferLength += remainderLength - 1 - padding;
+    if (remainderLength != 0 && paddingStart < end) {
+      bufferLength += remainderLength - 1;
     }
     if (bufferLength > 0) return new Uint8List(bufferLength);
-    // If the input plus state is less than four characters, no buffer
-    // is needed.
+    // If the input plus state is less than four characters, and it's not
+    // at the end of input, no buffer is needed.
     return null;
   }
 
   /**
+   * Returns the position of the start of padding at the end of the input.
+   *
+   * Returns the end of input if there is no padding.
+   *
+   * This is used to ensure that the decoding buffer has the exact size
+   * it needs when input is valid, and at least enough bytes to reach the error
+   * when input is invalid.
+   *
+   * Never count more than two padding sequences since any more than that
+   * will raise an error anyway, and we only care about being precise for
+   * successful conversions.
+   */
+  static int _trimPaddingChars(String input, int start, int end) {
+    // This may count '%=' as two paddings. That's ok, it will err later,
+    // but the buffer will be large enough to reach the error.
+    int padding = 0;
+    int index = end;
+    int newEnd = end;
+    while (index > start && padding < 2) {
+      index--;
+      int char = input.codeUnitAt(index);
+      if (char == _paddingChar) {
+        padding++;
+        newEnd = index;
+        continue;
+      }
+      if ((char | 0x20) == _char_d) {
+        if (index == start) break;
+        index--;
+        char = input.codeUnitAt(index);
+      }
+      if (char == _char_3) {
+        if (index == start) break;
+        index--;
+        char = input.codeUnitAt(index);
+      }
+      if (char == _char_percent) {
+        padding++;
+        newEnd = index;
+        continue;
+      }
+      break;
+    }
+    return newEnd;
+  }
+
+  /**
    * Check that the remainder of the string is valid padding.
    *
-   * That means zero or one padding character (depending on [_state])
-   * and nothing else.
+   * Valid padding is a correct number (0, 1 or 2) of `=` characters
+   * or `%3D` sequences depending on the number of preceding BASE-64 characters.
+   * The [state] parameter encodes which padding continuations are allowed
+   * as the number of expected characters. That number is the number of
+   * expected padding characters times 3 minus the number of padding characters
+   * seen so far, where `=` counts as 3 counts as three characters,
+   * and the padding sequence `%3D` counts as one character per character.
+   *
+   * The number of missing characters is always between 0 and 5 because we
+   * only call this function after having seen at least one `=` or `%`
+   * character.
+   * If the number of missing characters is not 3 or 0, we have seen (at least)
+   * a `%` character and expects the rest of the `%3D` sequence, and a `=` is
+   * not allowed. When missing 3 characters, either `=` or `%` is allowed.
+   *
+   * When the value is 0, no more padding (or any other character) is allowed.
    */
   static int _checkPadding(String input, int start, int end, int state) {
     assert(_hasSeenPadding(state));
     if (start == end) return state;
     int expectedPadding = _statePadding(state);
-    if (expectedPadding > 0) {
-      int firstChar = input.codeUnitAt(start);
-      if (firstChar != _paddingChar) {
-        throw new FormatException("Missing padding character", input, start);
+    assert(expectedPadding >= 0);
+    assert(expectedPadding < 6);
+    while (expectedPadding > 0) {
+      int char = input.codeUnitAt(start);
+      if (expectedPadding == 3) {
+        if (char == _paddingChar) {
+          expectedPadding -= 3;
+          start++;
+          break;
+        }
+        if (char == _char_percent) {
+          expectedPadding--;
+          start++;
+          if (start == end) break;
+          char = input.codeUnitAt(start);
+        } else {
+          break;
+        }
       }
-      state = _encodePaddingState(0);
+      // Partial padding means we have seen part of a "%3D" escape.
+      int expectedPartialPadding = expectedPadding;
+      if (expectedPartialPadding > 3) expectedPartialPadding -= 3;
+      if (expectedPartialPadding == 2) {
+        // Expects '3'
+        if (char != _char_3) break;
+        start++;
+        expectedPadding--;
+        if (start == end) break;
+        char = input.codeUnitAt(start);
+      }
+      // Expects 'D' or 'd'.
+      if ((char | 0x20) != _char_d) break;
       start++;
+      expectedPadding--;
+      if (start == end) break;
     }
     if (start != end) {
-      throw new FormatException("Invalid character after padding",
+      throw new FormatException("Invalid padding character",
                                 input, start);
     }
-    return state;
+    return _encodePaddingState(expectedPadding);
   }
 }
 
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index cc5be5b..244b4b4 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -119,6 +119,7 @@
   return _Utils.spawnDomUri(uri.toString());
 }
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final htmlBlinkMap = {
   '_HistoryCrossFrame': () => _HistoryCrossFrame,
   '_LocationCrossFrame': () => _LocationCrossFrame,
@@ -1013,6 +1014,7 @@
 
 // TODO(terry): We may want to move this elsewhere if html becomes
 // a package to avoid dartium depending on pkg:html.
+@Deprecated("Internal Use Only")
 getHtmlCreateFunction(String key) {
   var result;
 
@@ -1145,9 +1147,13 @@
 
 /// An abstract class for all DOM objects we wrap in dart:html and related
 ///  libraries.
+///
+/// ** Internal Use Only **
+@Deprecated("Internal Use Only")
 class DartHtmlDomObject {
 
   /// The underlying JS DOM object.
+  @Deprecated("Internal Use Only")
   js.JsObject blink_jsObject;
 
 }
@@ -1178,11 +1184,13 @@
   return dartInstance;
 }
 
+@Deprecated("Internal Use Only")
 class DebugAssertException implements Exception {
   String message;
   DebugAssertException(this.message);
 }
 
+@Deprecated("Internal Use Only")
 debug_or_assert(message, expression) {
   if (!expression) {
     throw new DebugAssertException("$message");
@@ -1195,6 +1203,7 @@
 //              user's this (this is needed for futures) and listener function.
 Map<int, Map<int, js.JsFunction>> _knownListeners = {};
 
+@Deprecated("Internal Use Only")
 js.JsFunction wrap_event_listener(theObject, Function listener) {
   var thisHashCode = theObject.hashCode;
   var listenerHashCode = identityHashCode(listener);
@@ -1206,6 +1215,7 @@
   return _knownListeners[thisHashCode][listenerHashCode];
 }
 
+@Deprecated("Internal Use Only")
 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
   var result = new Map();
   var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), 'keys', [jsObject]);
@@ -1283,6 +1293,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static AnchorElement internalCreateAnchorElement() {
     return new AnchorElement._internalWrap();
   }
@@ -1476,6 +1487,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static Animation internalCreateAnimation() {
     return new Animation._internalWrap();
   }
@@ -1502,6 +1514,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimationEffect internalCreateAnimationEffect() {
     return new AnimationEffect._internalWrap();
   }
@@ -1533,6 +1546,7 @@
   factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AnimationEvent internalCreateAnimationEvent() {
     return new AnimationEvent._internalWrap();
   }
@@ -1567,6 +1581,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimationNode internalCreateAnimationNode() {
     return new AnimationNode._internalWrap();
   }
@@ -1636,6 +1651,7 @@
   factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AnimationPlayer internalCreateAnimationPlayer() {
     return new AnimationPlayer._internalWrap();
   }
@@ -1736,6 +1752,7 @@
   factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AnimationPlayerEvent internalCreateAnimationPlayerEvent() {
     return new AnimationPlayerEvent._internalWrap();
   }
@@ -1772,6 +1789,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimationTimeline internalCreateAnimationTimeline() {
     return new AnimationTimeline._internalWrap();
   }
@@ -1904,6 +1922,7 @@
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
 
+  @Deprecated("Internal Use Only")
   static ApplicationCache internalCreateApplicationCache() {
     return new ApplicationCache._internalWrap();
   }
@@ -2014,6 +2033,7 @@
   factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ApplicationCacheErrorEvent internalCreateApplicationCacheErrorEvent() {
     return new ApplicationCacheErrorEvent._internalWrap();
   }
@@ -2074,6 +2094,7 @@
   factory AreaElement() => document.createElement("area");
 
 
+  @Deprecated("Internal Use Only")
   static AreaElement internalCreateAreaElement() {
     return new AreaElement._internalWrap();
   }
@@ -2234,6 +2255,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static AudioElement internalCreateAudioElement() {
     return new AudioElement._internalWrap();
   }
@@ -2272,6 +2294,7 @@
   // To suppress missing implicit constructor warnings.
   factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AudioTrack internalCreateAudioTrack() {
     return new AudioTrack._internalWrap();
   }
@@ -2336,6 +2359,7 @@
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
 
+  @Deprecated("Internal Use Only")
   static AudioTrackList internalCreateAudioTrackList() {
     return new AudioTrackList._internalWrap();
   }
@@ -2384,6 +2408,7 @@
   factory AutocompleteErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AutocompleteErrorEvent internalCreateAutocompleteErrorEvent() {
     return new AutocompleteErrorEvent._internalWrap();
   }
@@ -2418,6 +2443,7 @@
   factory BRElement() => document.createElement("br");
 
 
+  @Deprecated("Internal Use Only")
   static BRElement internalCreateBRElement() {
     return new BRElement._internalWrap();
   }
@@ -2451,6 +2477,7 @@
   // To suppress missing implicit constructor warnings.
   factory BarProp._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static BarProp internalCreateBarProp() {
     return new BarProp._internalWrap();
   }
@@ -2487,6 +2514,7 @@
   factory BaseElement() => document.createElement("base");
 
 
+  @Deprecated("Internal Use Only")
   static BaseElement internalCreateBaseElement() {
     return new BaseElement._internalWrap();
   }
@@ -2537,6 +2565,7 @@
   factory BatteryManager._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static BatteryManager internalCreateBatteryManager() {
     return new BatteryManager._internalWrap();
   }
@@ -2579,6 +2608,7 @@
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static BeforeUnloadEvent internalCreateBeforeUnloadEvent() {
     return new BeforeUnloadEvent._internalWrap();
   }
@@ -2609,6 +2639,7 @@
   // To suppress missing implicit constructor warnings.
   factory Blob._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Blob internalCreateBlob() {
     return new Blob._internalWrap();
   }
@@ -2677,6 +2708,7 @@
   // To suppress missing implicit constructor warnings.
   factory Body._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Body internalCreateBody() {
     return new Body._internalWrap();
   }
@@ -2859,6 +2891,7 @@
   factory BodyElement() => document.createElement("body");
 
 
+  @Deprecated("Internal Use Only")
   static BodyElement internalCreateBodyElement() {
     return new BodyElement._internalWrap();
   }
@@ -2960,6 +2993,7 @@
   factory ButtonElement() => document.createElement("button");
 
 
+  @Deprecated("Internal Use Only")
   static ButtonElement internalCreateButtonElement() {
     return new ButtonElement._internalWrap();
   }
@@ -3103,6 +3137,7 @@
   factory CDataSection._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CDataSection internalCreateCDataSection() {
     return new CDataSection._internalWrap();
   }
@@ -3129,6 +3164,7 @@
   // To suppress missing implicit constructor warnings.
   factory CacheStorage._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CacheStorage internalCreateCacheStorage() {
     return new CacheStorage._internalWrap();
   }
@@ -3183,6 +3219,7 @@
   // To suppress missing implicit constructor warnings.
   factory Canvas2DContextAttributes._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Canvas2DContextAttributes internalCreateCanvas2DContextAttributes() {
     return new Canvas2DContextAttributes._internalWrap();
   }
@@ -3255,6 +3292,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static CanvasElement internalCreateCanvasElement() {
     return new CanvasElement._internalWrap();
   }
@@ -3430,6 +3468,7 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasGradient._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CanvasGradient internalCreateCanvasGradient() {
     return new CanvasGradient._internalWrap();
   }
@@ -3497,6 +3536,7 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasPattern._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CanvasPattern internalCreateCanvasPattern() {
     return new CanvasPattern._internalWrap();
   }
@@ -3530,6 +3570,7 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CanvasRenderingContext2D internalCreateCanvasRenderingContext2D() {
     return new CanvasRenderingContext2D._internalWrap();
   }
@@ -4318,6 +4359,7 @@
   factory CharacterData._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CharacterData internalCreateCharacterData() {
     return new CharacterData._internalWrap();
   }
@@ -4422,6 +4464,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static CircularGeofencingRegion internalCreateCircularGeofencingRegion() {
     return new CircularGeofencingRegion._internalWrap();
   }
@@ -4473,6 +4516,7 @@
   factory CloseEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CloseEvent internalCreateCloseEvent() {
     return new CloseEvent._internalWrap();
   }
@@ -4518,6 +4562,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static Comment internalCreateComment() {
     return new Comment._internalWrap();
   }
@@ -4555,6 +4600,7 @@
   factory CompositionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CompositionEvent internalCreateCompositionEvent() {
     return new CompositionEvent._internalWrap();
   }
@@ -4604,6 +4650,7 @@
   factory Console._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static Console internalCreateConsole() {
     return new Console._internalWrap();
   }
@@ -4635,6 +4682,7 @@
   // To suppress missing implicit constructor warnings.
   factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ConsoleBase internalCreateConsoleBase() {
     return new ConsoleBase._internalWrap();
   }
@@ -4785,6 +4833,7 @@
   factory ContentElement() => document.createElement("content");
 
 
+  @Deprecated("Internal Use Only")
   static ContentElement internalCreateContentElement() {
     return new ContentElement._internalWrap();
   }
@@ -4831,6 +4880,7 @@
   // To suppress missing implicit constructor warnings.
   factory Coordinates._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Coordinates internalCreateCoordinates() {
     return new Coordinates._internalWrap();
   }
@@ -4887,6 +4937,7 @@
   // To suppress missing implicit constructor warnings.
   factory Credential._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Credential internalCreateCredential() {
     return new Credential._internalWrap();
   }
@@ -4930,6 +4981,7 @@
   // To suppress missing implicit constructor warnings.
   factory CredentialsContainer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CredentialsContainer internalCreateCredentialsContainer() {
     return new CredentialsContainer._internalWrap();
   }
@@ -4993,6 +5045,7 @@
   // To suppress missing implicit constructor warnings.
   factory Crypto._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Crypto internalCreateCrypto() {
     return new Crypto._internalWrap();
   }
@@ -5033,6 +5086,7 @@
   // To suppress missing implicit constructor warnings.
   factory CryptoKey._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CryptoKey internalCreateCryptoKey() {
     return new CryptoKey._internalWrap();
   }
@@ -5082,6 +5136,7 @@
   // To suppress missing implicit constructor warnings.
   factory Css._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Css internalCreateCss() {
     return new Css._internalWrap();
   }
@@ -5120,6 +5175,7 @@
   factory CssCharsetRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssCharsetRule internalCreateCssCharsetRule() {
     return new CssCharsetRule._internalWrap();
   }
@@ -5158,6 +5214,7 @@
   factory CssFilterRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssFilterRule internalCreateCssFilterRule() {
     return new CssFilterRule._internalWrap();
   }
@@ -5188,6 +5245,7 @@
   factory CssFontFaceRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssFontFaceRule internalCreateCssFontFaceRule() {
     return new CssFontFaceRule._internalWrap();
   }
@@ -5218,6 +5276,7 @@
   factory CssImportRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssImportRule internalCreateCssImportRule() {
     return new CssImportRule._internalWrap();
   }
@@ -5257,6 +5316,7 @@
   factory CssKeyframeRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssKeyframeRule internalCreateCssKeyframeRule() {
     return new CssKeyframeRule._internalWrap();
   }
@@ -5299,6 +5359,7 @@
   factory CssKeyframesRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssKeyframesRule internalCreateCssKeyframesRule() {
     return new CssKeyframesRule._internalWrap();
   }
@@ -5360,6 +5421,7 @@
   factory CssMediaRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssMediaRule internalCreateCssMediaRule() {
     return new CssMediaRule._internalWrap();
   }
@@ -5402,6 +5464,7 @@
   factory CssPageRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssPageRule internalCreateCssPageRule() {
     return new CssPageRule._internalWrap();
   }
@@ -5439,6 +5502,7 @@
   // To suppress missing implicit constructor warnings.
   factory CssRule._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CssRule internalCreateCssRule() {
     return new CssRule._internalWrap();
   }
@@ -5637,6 +5701,7 @@
   // To suppress missing implicit constructor warnings.
   factory CssStyleDeclaration._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CssStyleDeclaration internalCreateCssStyleDeclaration() {
     return new CssStyleDeclaration._internalWrap();
   }
@@ -8833,6 +8898,7 @@
   factory CssStyleRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssStyleRule internalCreateCssStyleRule() {
     return new CssStyleRule._internalWrap();
   }
@@ -8871,6 +8937,7 @@
   factory CssStyleSheet._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssStyleSheet internalCreateCssStyleSheet() {
     return new CssStyleSheet._internalWrap();
   }
@@ -8933,6 +9000,7 @@
   factory CssSupportsRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssSupportsRule internalCreateCssSupportsRule() {
     return new CssSupportsRule._internalWrap();
   }
@@ -8976,6 +9044,7 @@
   factory CssViewportRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CssViewportRule internalCreateCssViewportRule() {
     return new CssViewportRule._internalWrap();
   }
@@ -9040,6 +9109,7 @@
   factory CustomEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CustomEvent internalCreateCustomEvent() {
     return new CustomEvent._internalWrap();
   }
@@ -9078,6 +9148,7 @@
   factory DListElement() => document.createElement("dl");
 
 
+  @Deprecated("Internal Use Only")
   static DListElement internalCreateDListElement() {
     return new DListElement._internalWrap();
   }
@@ -9118,6 +9189,7 @@
   factory DataListElement() => document.createElement("datalist");
 
 
+  @Deprecated("Internal Use Only")
   static DataListElement internalCreateDataListElement() {
     return new DataListElement._internalWrap();
   }
@@ -9157,6 +9229,7 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DataTransfer internalCreateDataTransfer() {
     return new DataTransfer._internalWrap();
   }
@@ -9245,6 +9318,7 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItem._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DataTransferItem internalCreateDataTransferItem() {
     return new DataTransferItem._internalWrap();
   }
@@ -9302,6 +9376,7 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItemList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DataTransferItemList internalCreateDataTransferItemList() {
     return new DataTransferItemList._internalWrap();
   }
@@ -9394,6 +9469,7 @@
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
 
+  @Deprecated("Internal Use Only")
   static DedicatedWorkerGlobalScope internalCreateDedicatedWorkerGlobalScope() {
     return new DedicatedWorkerGlobalScope._internalWrap();
   }
@@ -9431,6 +9507,7 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DeprecatedStorageInfo internalCreateDeprecatedStorageInfo() {
     return new DeprecatedStorageInfo._internalWrap();
   }
@@ -9495,6 +9572,7 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageQuota._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DeprecatedStorageQuota internalCreateDeprecatedStorageQuota() {
     return new DeprecatedStorageQuota._internalWrap();
   }
@@ -9552,6 +9630,7 @@
   factory DetailsElement() => document.createElement("details");
 
 
+  @Deprecated("Internal Use Only")
   static DetailsElement internalCreateDetailsElement() {
     return new DetailsElement._internalWrap();
   }
@@ -9596,6 +9675,7 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceAcceleration._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DeviceAcceleration internalCreateDeviceAcceleration() {
     return new DeviceAcceleration._internalWrap();
   }
@@ -9637,6 +9717,7 @@
   factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DeviceLightEvent internalCreateDeviceLightEvent() {
     return new DeviceLightEvent._internalWrap();
   }
@@ -9670,6 +9751,7 @@
   factory DeviceMotionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DeviceMotionEvent internalCreateDeviceMotionEvent() {
     return new DeviceMotionEvent._internalWrap();
   }
@@ -9725,6 +9807,7 @@
   factory DeviceOrientationEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DeviceOrientationEvent internalCreateDeviceOrientationEvent() {
     return new DeviceOrientationEvent._internalWrap();
   }
@@ -9772,6 +9855,7 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceRotationRate._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DeviceRotationRate internalCreateDeviceRotationRate() {
     return new DeviceRotationRate._internalWrap();
   }
@@ -9813,6 +9897,7 @@
   factory DialogElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DialogElement internalCreateDialogElement() {
     return new DialogElement._internalWrap();
   }
@@ -9911,6 +9996,7 @@
   factory DirectoryEntry._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DirectoryEntry internalCreateDirectoryEntry() {
     return new DirectoryEntry._internalWrap();
   }
@@ -10009,6 +10095,7 @@
   // To suppress missing implicit constructor warnings.
   factory DirectoryReader._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DirectoryReader internalCreateDirectoryReader() {
     return new DirectoryReader._internalWrap();
   }
@@ -10080,6 +10167,7 @@
   factory DivElement() => document.createElement("div");
 
 
+  @Deprecated("Internal Use Only")
   static DivElement internalCreateDivElement() {
     return new DivElement._internalWrap();
   }
@@ -10163,6 +10251,7 @@
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
 
+  @Deprecated("Internal Use Only")
   static Document internalCreateDocument() {
     return new Document._internalWrap();
   }
@@ -11100,6 +11189,7 @@
   factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DocumentFragment internalCreateDocumentFragment() {
     return new DocumentFragment._internalWrap();
   }
@@ -11168,6 +11258,7 @@
     return wrap_jso(_blink.BlinkDOMError.instance.constructorCallback_2_(name, message));
   }
 
+  @Deprecated("Internal Use Only")
   static DomError internalCreateDomError() {
     return new DomError._internalWrap();
   }
@@ -11228,6 +11319,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomException._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomException internalCreateDomException() {
     return new DomException._internalWrap();
   }
@@ -11277,6 +11369,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomImplementation._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomImplementation internalCreateDomImplementation() {
     return new DomImplementation._internalWrap();
   }
@@ -11321,6 +11414,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomIterator._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomIterator internalCreateDomIterator() {
     return new DomIterator._internalWrap();
   }
@@ -11369,6 +11463,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static DomMatrix internalCreateDomMatrix() {
     return new DomMatrix._internalWrap();
   }
@@ -11674,6 +11769,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomMatrixReadOnly._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomMatrixReadOnly internalCreateDomMatrixReadOnly() {
     return new DomMatrixReadOnly._internalWrap();
   }
@@ -11891,6 +11987,7 @@
     return wrap_jso(_blink.BlinkDOMParser.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static DomParser internalCreateDomParser() {
     return new DomParser._internalWrap();
   }
@@ -11946,6 +12043,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static DomPoint internalCreateDomPoint() {
     return new DomPoint._internalWrap();
   }
@@ -12021,6 +12119,7 @@
     return wrap_jso(_blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w));
   }
 
+  @Deprecated("Internal Use Only")
   static DomPointReadOnly internalCreateDomPointReadOnly() {
     return new DomPointReadOnly._internalWrap();
   }
@@ -12163,6 +12262,7 @@
     return wrap_jso(_blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height));
   }
 
+  @Deprecated("Internal Use Only")
   static DomRectReadOnly internalCreateDomRectReadOnly() {
     return new DomRectReadOnly._internalWrap();
   }
@@ -12229,6 +12329,7 @@
   factory DomSettableTokenList._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DomSettableTokenList internalCreateDomSettableTokenList() {
     return new DomSettableTokenList._internalWrap();
   }
@@ -12266,6 +12367,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomStringList internalCreateDomStringList() {
     return new DomStringList._internalWrap();
   }
@@ -12397,6 +12499,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomTokenList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomTokenList internalCreateDomTokenList() {
     return new DomTokenList._internalWrap();
   }
@@ -15404,6 +15507,7 @@
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
 
+  @Deprecated("Internal Use Only")
   static Element internalCreateElement() {
     return new Element._internalWrap();
   }
@@ -16294,6 +16398,7 @@
   factory EmbedElement() => document.createElement("embed");
 
 
+  @Deprecated("Internal Use Only")
   static EmbedElement internalCreateEmbedElement() {
     return new EmbedElement._internalWrap();
   }
@@ -16399,6 +16504,7 @@
   // To suppress missing implicit constructor warnings.
   factory Entry._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Entry internalCreateEntry() {
     return new Entry._internalWrap();
   }
@@ -16579,6 +16685,7 @@
   factory ErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ErrorEvent internalCreateErrorEvent() {
     return new ErrorEvent._internalWrap();
   }
@@ -16674,6 +16781,7 @@
   // To suppress missing implicit constructor warnings.
   factory Event._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Event internalCreateEvent() {
     return new Event._internalWrap();
   }
@@ -16865,6 +16973,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static EventSource internalCreateEventSource() {
     return new EventSource._internalWrap();
   }
@@ -17048,6 +17157,7 @@
   // To suppress missing implicit constructor warnings.
   factory EventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static EventTarget internalCreateEventTarget() {
     return new EventTarget._internalWrap();
   }
@@ -17115,6 +17225,7 @@
   factory ExtendableEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ExtendableEvent internalCreateExtendableEvent() {
     return new ExtendableEvent._internalWrap();
   }
@@ -17153,6 +17264,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static FederatedCredential internalCreateFederatedCredential() {
     return new FederatedCredential._internalWrap();
   }
@@ -17185,6 +17297,7 @@
   factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FetchEvent internalCreateFetchEvent() {
     return new FetchEvent._internalWrap();
   }
@@ -17231,6 +17344,7 @@
   factory FieldSetElement() => document.createElement("fieldset");
 
 
+  @Deprecated("Internal Use Only")
   static FieldSetElement internalCreateFieldSetElement() {
     return new FieldSetElement._internalWrap();
   }
@@ -17311,6 +17425,7 @@
   factory File._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static File internalCreateFile() {
     return new File._internalWrap();
   }
@@ -17371,6 +17486,7 @@
   factory FileEntry._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FileEntry internalCreateFileEntry() {
     return new FileEntry._internalWrap();
   }
@@ -17433,6 +17549,7 @@
   factory FileError._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FileError internalCreateFileError() {
     return new FileError._internalWrap();
   }
@@ -17510,6 +17627,7 @@
   // To suppress missing implicit constructor warnings.
   factory FileList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static FileList internalCreateFileList() {
     return new FileList._internalWrap();
   }
@@ -17667,6 +17785,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static FileReader internalCreateFileReader() {
     return new FileReader._internalWrap();
   }
@@ -17768,6 +17887,7 @@
   // To suppress missing implicit constructor warnings.
   factory FileStream._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static FileStream internalCreateFileStream() {
     return new FileStream._internalWrap();
   }
@@ -17803,6 +17923,7 @@
   // To suppress missing implicit constructor warnings.
   factory FileSystem._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static FileSystem internalCreateFileSystem() {
     return new FileSystem._internalWrap();
   }
@@ -17915,6 +18036,7 @@
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
 
 
+  @Deprecated("Internal Use Only")
   static FileWriter internalCreateFileWriter() {
     return new FileWriter._internalWrap();
   }
@@ -18026,6 +18148,7 @@
   factory FocusEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FocusEvent internalCreateFocusEvent() {
     return new FocusEvent._internalWrap();
   }
@@ -18083,6 +18206,7 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  @Deprecated("Internal Use Only")
   static FontFace internalCreateFontFace() {
     return new FontFace._internalWrap();
   }
@@ -18197,6 +18321,7 @@
   factory FontFaceSet._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FontFaceSet internalCreateFontFaceSet() {
     return new FontFaceSet._internalWrap();
   }
@@ -18280,6 +18405,7 @@
   factory FontFaceSetLoadEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FontFaceSetLoadEvent internalCreateFontFaceSetLoadEvent() {
     return new FontFaceSetLoadEvent._internalWrap();
   }
@@ -18321,6 +18447,7 @@
   @DocsEditable()
   static FormData _create(form) => wrap_jso(_blink.BlinkFormData.instance.constructorCallback_1_(form));
 
+  @Deprecated("Internal Use Only")
   static FormData internalCreateFormData() {
     return new FormData._internalWrap();
   }
@@ -18364,6 +18491,7 @@
   factory FormElement() => document.createElement("form");
 
 
+  @Deprecated("Internal Use Only")
   static FormElement internalCreateFormElement() {
     return new FormElement._internalWrap();
   }
@@ -18505,6 +18633,7 @@
   // To suppress missing implicit constructor warnings.
   factory Gamepad._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Gamepad internalCreateGamepad() {
     return new Gamepad._internalWrap();
   }
@@ -18559,6 +18688,7 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static GamepadButton internalCreateGamepadButton() {
     return new GamepadButton._internalWrap();
   }
@@ -18598,6 +18728,7 @@
   factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static GamepadEvent internalCreateGamepadEvent() {
     return new GamepadEvent._internalWrap();
   }
@@ -18629,6 +18760,7 @@
   // To suppress missing implicit constructor warnings.
   factory Geofencing._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Geofencing internalCreateGeofencing() {
     return new Geofencing._internalWrap();
   }
@@ -18672,6 +18804,7 @@
   // To suppress missing implicit constructor warnings.
   factory GeofencingRegion._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static GeofencingRegion internalCreateGeofencingRegion() {
     return new GeofencingRegion._internalWrap();
   }
@@ -18774,6 +18907,7 @@
   // To suppress missing implicit constructor warnings.
   factory Geolocation._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Geolocation internalCreateGeolocation() {
     return new Geolocation._internalWrap();
   }
@@ -18829,6 +18963,7 @@
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Geoposition internalCreateGeoposition() {
     return new Geoposition._internalWrap();
   }
@@ -19404,6 +19539,7 @@
   factory HRElement() => document.createElement("hr");
 
 
+  @Deprecated("Internal Use Only")
   static HRElement internalCreateHRElement() {
     return new HRElement._internalWrap();
   }
@@ -19455,6 +19591,7 @@
   factory HashChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static HashChangeEvent internalCreateHashChangeEvent() {
     return new HashChangeEvent._internalWrap();
   }
@@ -19500,6 +19637,7 @@
   factory HeadElement() => document.createElement("head");
 
 
+  @Deprecated("Internal Use Only")
   static HeadElement internalCreateHeadElement() {
     return new HeadElement._internalWrap();
   }
@@ -19548,6 +19686,7 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  @Deprecated("Internal Use Only")
   static Headers internalCreateHeaders() {
     return new Headers._internalWrap();
   }
@@ -19624,6 +19763,7 @@
   factory HeadingElement.h6() => document.createElement("h6");
 
 
+  @Deprecated("Internal Use Only")
   static HeadingElement internalCreateHeadingElement() {
     return new HeadingElement._internalWrap();
   }
@@ -19663,6 +19803,7 @@
   // To suppress missing implicit constructor warnings.
   factory History._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static History internalCreateHistory() {
     return new History._internalWrap();
   }
@@ -19725,6 +19866,7 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlCollection._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static HtmlCollection internalCreateHtmlCollection() {
     return new HtmlCollection._internalWrap();
   }
@@ -19810,6 +19952,7 @@
   factory HtmlDocument._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static HtmlDocument internalCreateHtmlDocument() {
     return new HtmlDocument._internalWrap();
   }
@@ -20618,6 +20761,7 @@
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
 
+  @Deprecated("Internal Use Only")
   static HtmlElement internalCreateHtmlElement() {
     return new HtmlElement._internalWrap();
   }
@@ -21037,6 +21181,7 @@
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static HtmlFormControlsCollection internalCreateHtmlFormControlsCollection() {
     return new HtmlFormControlsCollection._internalWrap();
   }
@@ -21071,6 +21216,7 @@
   factory HtmlHtmlElement() => document.createElement("html");
 
 
+  @Deprecated("Internal Use Only")
   static HtmlHtmlElement internalCreateHtmlHtmlElement() {
     return new HtmlHtmlElement._internalWrap();
   }
@@ -21103,6 +21249,7 @@
   factory HtmlOptionsCollection._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static HtmlOptionsCollection internalCreateHtmlOptionsCollection() {
     return new HtmlOptionsCollection._internalWrap();
   }
@@ -21513,6 +21660,7 @@
   static HttpRequest _create() => wrap_jso(_blink.BlinkXMLHttpRequest.instance.constructorCallback_0_());
 
 
+  @Deprecated("Internal Use Only")
   static HttpRequest internalCreateHttpRequest() {
     return new HttpRequest._internalWrap();
   }
@@ -21926,6 +22074,7 @@
   static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
 
 
+  @Deprecated("Internal Use Only")
   static HttpRequestEventTarget internalCreateHttpRequestEventTarget() {
     return new HttpRequestEventTarget._internalWrap();
   }
@@ -22004,6 +22153,7 @@
   factory HttpRequestUpload._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static HttpRequestUpload internalCreateHttpRequestUpload() {
     return new HttpRequestUpload._internalWrap();
   }
@@ -22034,6 +22184,7 @@
   factory IFrameElement() => document.createElement("iframe");
 
 
+  @Deprecated("Internal Use Only")
   static IFrameElement internalCreateIFrameElement() {
     return new IFrameElement._internalWrap();
   }
@@ -22138,6 +22289,7 @@
   // To suppress missing implicit constructor warnings.
   factory ImageBitmap._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ImageBitmap internalCreateImageBitmap() {
     return new ImageBitmap._internalWrap();
   }
@@ -22192,6 +22344,7 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  @Deprecated("Internal Use Only")
   static ImageData internalCreateImageData() {
     return new ImageData._internalWrap();
   }
@@ -22239,6 +22392,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static ImageElement internalCreateImageElement() {
     return new ImageElement._internalWrap();
   }
@@ -22374,6 +22528,7 @@
   // To suppress missing implicit constructor warnings.
   factory InjectedScriptHost._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static InjectedScriptHost internalCreateInjectedScriptHost() {
     return new InjectedScriptHost._internalWrap();
   }
@@ -22437,6 +22592,7 @@
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static InputElement internalCreateInputElement() {
     return new InputElement._internalWrap();
   }
@@ -23457,6 +23613,7 @@
   factory InputMethodContext._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static InputMethodContext internalCreateInputMethodContext() {
     return new InputMethodContext._internalWrap();
   }
@@ -23507,6 +23664,7 @@
   factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static InstallEvent internalCreateInstallEvent() {
     return new InstallEvent._internalWrap();
   }
@@ -23559,6 +23717,7 @@
   factory KeyboardEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static KeyboardEvent internalCreateKeyboardEvent() {
     return new KeyboardEvent._internalWrap();
   }
@@ -23658,6 +23817,7 @@
   factory KeygenElement() => document.createElement("keygen");
 
 
+  @Deprecated("Internal Use Only")
   static KeygenElement internalCreateKeygenElement() {
     return new KeygenElement._internalWrap();
   }
@@ -23770,6 +23930,7 @@
   factory LIElement() => document.createElement("li");
 
 
+  @Deprecated("Internal Use Only")
   static LIElement internalCreateLIElement() {
     return new LIElement._internalWrap();
   }
@@ -23814,6 +23975,7 @@
   factory LabelElement() => document.createElement("label");
 
 
+  @Deprecated("Internal Use Only")
   static LabelElement internalCreateLabelElement() {
     return new LabelElement._internalWrap();
   }
@@ -23866,6 +24028,7 @@
   factory LegendElement() => document.createElement("legend");
 
 
+  @Deprecated("Internal Use Only")
   static LegendElement internalCreateLegendElement() {
     return new LegendElement._internalWrap();
   }
@@ -23904,6 +24067,7 @@
   factory LinkElement() => document.createElement("link");
 
 
+  @Deprecated("Internal Use Only")
   static LinkElement internalCreateLinkElement() {
     return new LinkElement._internalWrap();
   }
@@ -24030,6 +24194,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static LocalCredential internalCreateLocalCredential() {
     return new LocalCredential._internalWrap();
   }
@@ -24058,6 +24223,7 @@
   // To suppress missing implicit constructor warnings.
   factory Location._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Location internalCreateLocation() {
     return new Location._internalWrap();
   }
@@ -24204,6 +24370,7 @@
   factory MapElement() => document.createElement("map");
 
 
+  @Deprecated("Internal Use Only")
   static MapElement internalCreateMapElement() {
     return new MapElement._internalWrap();
   }
@@ -24256,6 +24423,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static MediaController internalCreateMediaController() {
     return new MediaController._internalWrap();
   }
@@ -24358,6 +24526,7 @@
   // To suppress missing implicit constructor warnings.
   factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MediaDeviceInfo internalCreateMediaDeviceInfo() {
     return new MediaDeviceInfo._internalWrap();
   }
@@ -24473,6 +24642,7 @@
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
 
 
+  @Deprecated("Internal Use Only")
   static MediaElement internalCreateMediaElement() {
     return new MediaElement._internalWrap();
   }
@@ -24835,6 +25005,7 @@
   // To suppress missing implicit constructor warnings.
   factory MediaError._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MediaError internalCreateMediaError() {
     return new MediaError._internalWrap();
   }
@@ -24890,6 +25061,7 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyError._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MediaKeyError internalCreateMediaKeyError() {
     return new MediaKeyError._internalWrap();
   }
@@ -24953,6 +25125,7 @@
   factory MediaKeyEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaKeyEvent internalCreateMediaKeyEvent() {
     return new MediaKeyEvent._internalWrap();
   }
@@ -25009,6 +25182,7 @@
   factory MediaKeyMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaKeyMessageEvent internalCreateMediaKeyMessageEvent() {
     return new MediaKeyMessageEvent._internalWrap();
   }
@@ -25045,6 +25219,7 @@
   factory MediaKeyNeededEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaKeyNeededEvent internalCreateMediaKeyNeededEvent() {
     return new MediaKeyNeededEvent._internalWrap();
   }
@@ -25082,6 +25257,7 @@
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaKeySession internalCreateMediaKeySession() {
     return new MediaKeySession._internalWrap();
   }
@@ -25151,6 +25327,7 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeys._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MediaKeys internalCreateMediaKeys() {
     return new MediaKeys._internalWrap();
   }
@@ -25200,6 +25377,7 @@
   // To suppress missing implicit constructor warnings.
   factory MediaList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MediaList internalCreateMediaList() {
     return new MediaList._internalWrap();
   }
@@ -25258,6 +25436,7 @@
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
 
+  @Deprecated("Internal Use Only")
   static MediaQueryList internalCreateMediaQueryList() {
     return new MediaQueryList._internalWrap();
   }
@@ -25306,6 +25485,7 @@
   factory MediaQueryListEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaQueryListEvent internalCreateMediaQueryListEvent() {
     return new MediaQueryListEvent._internalWrap();
   }
@@ -25352,6 +25532,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static MediaSource internalCreateMediaSource() {
     return new MediaSource._internalWrap();
   }
@@ -25467,6 +25648,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static MediaStream internalCreateMediaStream() {
     return new MediaStream._internalWrap();
   }
@@ -25567,6 +25749,7 @@
   factory MediaStreamEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaStreamEvent internalCreateMediaStreamEvent() {
     return new MediaStreamEvent._internalWrap();
   }
@@ -25633,6 +25816,7 @@
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
 
 
+  @Deprecated("Internal Use Only")
   static MediaStreamTrack internalCreateMediaStreamTrack() {
     return new MediaStreamTrack._internalWrap();
   }
@@ -25728,6 +25912,7 @@
   factory MediaStreamTrackEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaStreamTrackEvent internalCreateMediaStreamTrackEvent() {
     return new MediaStreamTrackEvent._internalWrap();
   }
@@ -25771,6 +25956,7 @@
   // To suppress missing implicit constructor warnings.
   factory MemoryInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MemoryInfo internalCreateMemoryInfo() {
     return new MemoryInfo._internalWrap();
   }
@@ -25825,6 +26011,7 @@
   factory MenuElement() => document.createElement("menu");
 
 
+  @Deprecated("Internal Use Only")
   static MenuElement internalCreateMenuElement() {
     return new MenuElement._internalWrap();
   }
@@ -25878,6 +26065,7 @@
   factory MenuItemElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MenuItemElement internalCreateMenuItemElement() {
     return new MenuItemElement._internalWrap();
   }
@@ -25960,6 +26148,7 @@
   // To suppress missing implicit constructor warnings.
   factory MessageChannel._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MessageChannel internalCreateMessageChannel() {
     return new MessageChannel._internalWrap();
   }
@@ -26007,6 +26196,7 @@
   factory MessageEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MessageEvent internalCreateMessageEvent() {
     return new MessageEvent._internalWrap();
   }
@@ -26065,6 +26255,7 @@
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
 
+  @Deprecated("Internal Use Only")
   static MessagePort internalCreateMessagePort() {
     return new MessagePort._internalWrap();
   }
@@ -26112,6 +26303,7 @@
   factory MetaElement() => document.createElement("meta");
 
 
+  @Deprecated("Internal Use Only")
   static MetaElement internalCreateMetaElement() {
     return new MetaElement._internalWrap();
   }
@@ -26169,6 +26361,7 @@
   // To suppress missing implicit constructor warnings.
   factory Metadata._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Metadata internalCreateMetadata() {
     return new Metadata._internalWrap();
   }
@@ -26224,6 +26417,7 @@
   factory MeterElement() => document.createElement("meter");
 
 
+  @Deprecated("Internal Use Only")
   static MeterElement internalCreateMeterElement() {
     return new MeterElement._internalWrap();
   }
@@ -26334,6 +26528,7 @@
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
 
+  @Deprecated("Internal Use Only")
   static MidiAccess internalCreateMidiAccess() {
     return new MidiAccess._internalWrap();
   }
@@ -26385,6 +26580,7 @@
   factory MidiConnectionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MidiConnectionEvent internalCreateMidiConnectionEvent() {
     return new MidiConnectionEvent._internalWrap();
   }
@@ -26427,6 +26623,7 @@
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
 
+  @Deprecated("Internal Use Only")
   static MidiInput internalCreateMidiInput() {
     return new MidiInput._internalWrap();
   }
@@ -26458,6 +26655,7 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MidiInputMap internalCreateMidiInputMap() {
     return new MidiInputMap._internalWrap();
   }
@@ -26518,6 +26716,7 @@
   factory MidiMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MidiMessageEvent internalCreateMidiMessageEvent() {
     return new MidiMessageEvent._internalWrap();
   }
@@ -26554,6 +26753,7 @@
   factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MidiOutput internalCreateMidiOutput() {
     return new MidiOutput._internalWrap();
   }
@@ -26589,6 +26789,7 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MidiOutputMap internalCreateMidiOutputMap() {
     return new MidiOutputMap._internalWrap();
   }
@@ -26659,6 +26860,7 @@
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
 
+  @Deprecated("Internal Use Only")
   static MidiPort internalCreateMidiPort() {
     return new MidiPort._internalWrap();
   }
@@ -26710,6 +26912,7 @@
   // To suppress missing implicit constructor warnings.
   factory MimeType._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MimeType internalCreateMimeType() {
     return new MimeType._internalWrap();
   }
@@ -26754,6 +26957,7 @@
   // To suppress missing implicit constructor warnings.
   factory MimeTypeArray._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MimeTypeArray internalCreateMimeTypeArray() {
     return new MimeTypeArray._internalWrap();
   }
@@ -26845,6 +27049,7 @@
   factory ModElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ModElement internalCreateModElement() {
     return new ModElement._internalWrap();
   }
@@ -26907,6 +27112,7 @@
   factory MouseEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MouseEvent internalCreateMouseEvent() {
     return new MouseEvent._internalWrap();
   }
@@ -27097,6 +27303,7 @@
   @DocsEditable()
   factory MutationObserver._(MutationCallback callback) => wrap_jso(_create(callback));
 
+  @Deprecated("Internal Use Only")
   static MutationObserver internalCreateMutationObserver() {
     return new MutationObserver._internalWrap();
   }
@@ -27207,6 +27414,7 @@
   // To suppress missing implicit constructor warnings.
   factory MutationRecord._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static MutationRecord internalCreateMutationRecord() {
     return new MutationRecord._internalWrap();
   }
@@ -27324,6 +27532,7 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Navigator internalCreateNavigator() {
     return new Navigator._internalWrap();
   }
@@ -27653,6 +27862,7 @@
   // To suppress missing implicit constructor warnings.
   factory NavigatorUserMediaError._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static NavigatorUserMediaError internalCreateNavigatorUserMediaError() {
     return new NavigatorUserMediaError._internalWrap();
   }
@@ -27716,6 +27926,7 @@
   factory NetworkInformation._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static NetworkInformation internalCreateNetworkInformation() {
     return new NetworkInformation._internalWrap();
   }
@@ -28017,6 +28228,7 @@
   factory Node._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static Node internalCreateNode() {
     return new Node._internalWrap();
   }
@@ -28359,6 +28571,7 @@
   // To suppress missing implicit constructor warnings.
   factory NodeFilter._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static NodeFilter internalCreateNodeFilter() {
     return new NodeFilter._internalWrap();
   }
@@ -28431,6 +28644,7 @@
   // To suppress missing implicit constructor warnings.
   factory NodeIterator._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static NodeIterator internalCreateNodeIterator() {
     return new NodeIterator._internalWrap();
   }
@@ -28486,6 +28700,7 @@
   // To suppress missing implicit constructor warnings.
   factory NodeList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static NodeList internalCreateNodeList() {
     return new NodeList._internalWrap();
   }
@@ -28629,6 +28844,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static Notification internalCreateNotification() {
     return new Notification._internalWrap();
   }
@@ -28747,6 +28963,7 @@
   factory OListElement() => document.createElement("ol");
 
 
+  @Deprecated("Internal Use Only")
   static OListElement internalCreateOListElement() {
     return new OListElement._internalWrap();
   }
@@ -28811,6 +29028,7 @@
   factory ObjectElement() => document.createElement("object");
 
 
+  @Deprecated("Internal Use Only")
   static ObjectElement internalCreateObjectElement() {
     return new ObjectElement._internalWrap();
   }
@@ -28940,6 +29158,7 @@
   factory OptGroupElement() => document.createElement("optgroup");
 
 
+  @Deprecated("Internal Use Only")
   static OptGroupElement internalCreateOptGroupElement() {
     return new OptGroupElement._internalWrap();
   }
@@ -28992,6 +29211,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static OptionElement internalCreateOptionElement() {
     return new OptionElement._internalWrap();
   }
@@ -29079,6 +29299,7 @@
   factory OutputElement() => document.createElement("output");
 
 
+  @Deprecated("Internal Use Only")
   static OutputElement internalCreateOutputElement() {
     return new OutputElement._internalWrap();
   }
@@ -29176,6 +29397,7 @@
   factory OverflowEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static OverflowEvent internalCreateOverflowEvent() {
     return new OverflowEvent._internalWrap();
   }
@@ -29228,6 +29450,7 @@
   factory PageTransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PageTransitionEvent internalCreatePageTransitionEvent() {
     return new PageTransitionEvent._internalWrap();
   }
@@ -29262,6 +29485,7 @@
   factory ParagraphElement() => document.createElement("p");
 
 
+  @Deprecated("Internal Use Only")
   static ParagraphElement internalCreateParagraphElement() {
     return new ParagraphElement._internalWrap();
   }
@@ -29299,6 +29523,7 @@
   factory ParamElement() => document.createElement("param");
 
 
+  @Deprecated("Internal Use Only")
   static ParamElement internalCreateParamElement() {
     return new ParamElement._internalWrap();
   }
@@ -29407,6 +29632,7 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  @Deprecated("Internal Use Only")
   static Path2D internalCreatePath2D() {
     return new Path2D._internalWrap();
   }
@@ -29506,6 +29732,7 @@
   static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
 
 
+  @Deprecated("Internal Use Only")
   static Performance internalCreatePerformance() {
     return new Performance._internalWrap();
   }
@@ -29618,6 +29845,7 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceEntry._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PerformanceEntry internalCreatePerformanceEntry() {
     return new PerformanceEntry._internalWrap();
   }
@@ -29664,6 +29892,7 @@
   factory PerformanceMark._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PerformanceMark internalCreatePerformanceMark() {
     return new PerformanceMark._internalWrap();
   }
@@ -29692,6 +29921,7 @@
   factory PerformanceMeasure._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PerformanceMeasure internalCreatePerformanceMeasure() {
     return new PerformanceMeasure._internalWrap();
   }
@@ -29718,6 +29948,7 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceNavigation._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PerformanceNavigation internalCreatePerformanceNavigation() {
     return new PerformanceNavigation._internalWrap();
   }
@@ -29772,6 +30003,7 @@
   factory PerformanceResourceTiming._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PerformanceResourceTiming internalCreatePerformanceResourceTiming() {
     return new PerformanceResourceTiming._internalWrap();
   }
@@ -29849,6 +30081,7 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceTiming._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PerformanceTiming internalCreatePerformanceTiming() {
     return new PerformanceTiming._internalWrap();
   }
@@ -29962,6 +30195,7 @@
   factory PictureElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PictureElement internalCreatePictureElement() {
     return new PictureElement._internalWrap();
   }
@@ -29994,6 +30228,7 @@
   // To suppress missing implicit constructor warnings.
   factory Plugin._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Plugin internalCreatePlugin() {
     return new Plugin._internalWrap();
   }
@@ -30050,6 +30285,7 @@
   // To suppress missing implicit constructor warnings.
   factory PluginArray._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PluginArray internalCreatePluginArray() {
     return new PluginArray._internalWrap();
   }
@@ -30145,6 +30381,7 @@
   factory PluginPlaceholderElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PluginPlaceholderElement internalCreatePluginPlaceholderElement() {
     return new PluginPlaceholderElement._internalWrap();
   }
@@ -30196,6 +30433,7 @@
   factory PopStateEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PopStateEvent internalCreatePopStateEvent() {
     return new PopStateEvent._internalWrap();
   }
@@ -30236,6 +30474,7 @@
   // To suppress missing implicit constructor warnings.
   factory PositionError._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PositionError internalCreatePositionError() {
     return new PositionError._internalWrap();
   }
@@ -30298,6 +30537,7 @@
   factory PreElement() => document.createElement("pre");
 
 
+  @Deprecated("Internal Use Only")
   static PreElement internalCreatePreElement() {
     return new PreElement._internalWrap();
   }
@@ -30331,6 +30571,7 @@
   factory Presentation._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static Presentation internalCreatePresentation() {
     return new Presentation._internalWrap();
   }
@@ -30358,6 +30599,7 @@
   factory ProcessingInstruction._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ProcessingInstruction internalCreateProcessingInstruction() {
     return new ProcessingInstruction._internalWrap();
   }
@@ -30401,6 +30643,7 @@
   factory ProgressElement() => document.createElement("progress");
 
 
+  @Deprecated("Internal Use Only")
   static ProgressElement internalCreateProgressElement() {
     return new ProgressElement._internalWrap();
   }
@@ -30461,6 +30704,7 @@
   factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ProgressEvent internalCreateProgressEvent() {
     return new ProgressEvent._internalWrap();
   }
@@ -30500,6 +30744,7 @@
   factory PushEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PushEvent internalCreatePushEvent() {
     return new PushEvent._internalWrap();
   }
@@ -30531,6 +30776,7 @@
   // To suppress missing implicit constructor warnings.
   factory PushManager._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PushManager internalCreatePushManager() {
     return new PushManager._internalWrap();
   }
@@ -30564,6 +30810,7 @@
   // To suppress missing implicit constructor warnings.
   factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PushRegistration internalCreatePushRegistration() {
     return new PushRegistration._internalWrap();
   }
@@ -30606,6 +30853,7 @@
   factory QuoteElement() => document.createElement("q");
 
 
+  @Deprecated("Internal Use Only")
   static QuoteElement internalCreateQuoteElement() {
     return new QuoteElement._internalWrap();
   }
@@ -30682,6 +30930,7 @@
   // To suppress missing implicit constructor warnings.
   factory Range._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Range internalCreateRange() {
     return new Range._internalWrap();
   }
@@ -30878,6 +31127,7 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableStream._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ReadableStream internalCreateReadableStream() {
     return new ReadableStream._internalWrap();
   }
@@ -30932,6 +31182,7 @@
   factory RelatedEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static RelatedEvent internalCreateRelatedEvent() {
     return new RelatedEvent._internalWrap();
   }
@@ -30974,6 +31225,7 @@
   factory ResourceProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ResourceProgressEvent internalCreateResourceProgressEvent() {
     return new ResourceProgressEvent._internalWrap();
   }
@@ -31046,6 +31298,7 @@
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
 
+  @Deprecated("Internal Use Only")
   static RtcDataChannel internalCreateRtcDataChannel() {
     return new RtcDataChannel._internalWrap();
   }
@@ -31188,6 +31441,7 @@
   factory RtcDataChannelEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static RtcDataChannelEvent internalCreateRtcDataChannelEvent() {
     return new RtcDataChannelEvent._internalWrap();
   }
@@ -31230,6 +31484,7 @@
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
 
 
+  @Deprecated("Internal Use Only")
   static RtcDtmfSender internalCreateRtcDtmfSender() {
     return new RtcDtmfSender._internalWrap();
   }
@@ -31296,6 +31551,7 @@
   factory RtcDtmfToneChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static RtcDtmfToneChangeEvent internalCreateRtcDtmfToneChangeEvent() {
     return new RtcDtmfToneChangeEvent._internalWrap();
   }
@@ -31335,6 +31591,7 @@
     return wrap_jso(_blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(dictionary_1));
   }
 
+  @Deprecated("Internal Use Only")
   static RtcIceCandidate internalCreateRtcIceCandidate() {
     return new RtcIceCandidate._internalWrap();
   }
@@ -31389,6 +31646,7 @@
   factory RtcIceCandidateEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static RtcIceCandidateEvent internalCreateRtcIceCandidateEvent() {
     return new RtcIceCandidateEvent._internalWrap();
   }
@@ -31529,6 +31787,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static RtcPeerConnection internalCreateRtcPeerConnection() {
     return new RtcPeerConnection._internalWrap();
   }
@@ -31725,6 +31984,7 @@
     return wrap_jso(_blink.BlinkRTCSessionDescription.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static RtcSessionDescription internalCreateRtcSessionDescription() {
     return new RtcSessionDescription._internalWrap();
   }
@@ -31770,6 +32030,7 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static RtcStatsReport internalCreateRtcStatsReport() {
     return new RtcStatsReport._internalWrap();
   }
@@ -31827,6 +32088,7 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsResponse._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static RtcStatsResponse internalCreateRtcStatsResponse() {
     return new RtcStatsResponse._internalWrap();
   }
@@ -31871,6 +32133,7 @@
   // To suppress missing implicit constructor warnings.
   factory Screen._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Screen internalCreateScreen() {
     return new Screen._internalWrap();
   }
@@ -31943,6 +32206,7 @@
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
 
+  @Deprecated("Internal Use Only")
   static ScreenOrientation internalCreateScreenOrientation() {
     return new ScreenOrientation._internalWrap();
   }
@@ -31998,6 +32262,7 @@
   factory ScriptElement() => document.createElement("script");
 
 
+  @Deprecated("Internal Use Only")
   static ScriptElement internalCreateScriptElement() {
     return new ScriptElement._internalWrap();
   }
@@ -32106,6 +32371,7 @@
   factory SecurityPolicyViolationEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SecurityPolicyViolationEvent internalCreateSecurityPolicyViolationEvent() {
     return new SecurityPolicyViolationEvent._internalWrap();
   }
@@ -32174,6 +32440,7 @@
   factory SelectElement() => document.createElement("select");
 
 
+  @Deprecated("Internal Use Only")
   static SelectElement internalCreateSelectElement() {
     return new SelectElement._internalWrap();
   }
@@ -32345,6 +32612,7 @@
   // To suppress missing implicit constructor warnings.
   factory Selection._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Selection internalCreateSelection() {
     return new Selection._internalWrap();
   }
@@ -32497,6 +32765,7 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ServiceWorkerClient internalCreateServiceWorkerClient() {
     return new ServiceWorkerClient._internalWrap();
   }
@@ -32535,6 +32804,7 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ServiceWorkerClients internalCreateServiceWorkerClients() {
     return new ServiceWorkerClients._internalWrap();
   }
@@ -32570,6 +32840,7 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ServiceWorkerContainer internalCreateServiceWorkerContainer() {
     return new ServiceWorkerContainer._internalWrap();
   }
@@ -32628,6 +32899,7 @@
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
 
+  @Deprecated("Internal Use Only")
   static ServiceWorkerGlobalScope internalCreateServiceWorkerGlobalScope() {
     return new ServiceWorkerGlobalScope._internalWrap();
   }
@@ -32696,6 +32968,7 @@
   factory ServiceWorkerRegistration._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ServiceWorkerRegistration internalCreateServiceWorkerRegistration() {
     return new ServiceWorkerRegistration._internalWrap();
   }
@@ -32754,6 +33027,7 @@
   factory ShadowElement() => document.createElement("shadow");
 
 
+  @Deprecated("Internal Use Only")
   static ShadowElement internalCreateShadowElement() {
     return new ShadowElement._internalWrap();
   }
@@ -32796,6 +33070,7 @@
   factory ShadowRoot._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ShadowRoot internalCreateShadowRoot() {
     return new ShadowRoot._internalWrap();
   }
@@ -32922,6 +33197,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static SharedWorker internalCreateSharedWorker() {
     return new SharedWorker._internalWrap();
   }
@@ -32974,6 +33250,7 @@
   static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
 
 
+  @Deprecated("Internal Use Only")
   static SharedWorkerGlobalScope internalCreateSharedWorkerGlobalScope() {
     return new SharedWorkerGlobalScope._internalWrap();
   }
@@ -33013,6 +33290,7 @@
   factory SourceBuffer._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SourceBuffer internalCreateSourceBuffer() {
     return new SourceBuffer._internalWrap();
   }
@@ -33116,6 +33394,7 @@
   factory SourceBufferList._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SourceBufferList internalCreateSourceBufferList() {
     return new SourceBufferList._internalWrap();
   }
@@ -33200,6 +33479,7 @@
   factory SourceElement() => document.createElement("source");
 
 
+  @Deprecated("Internal Use Only")
   static SourceElement internalCreateSourceElement() {
     return new SourceElement._internalWrap();
   }
@@ -33286,6 +33566,7 @@
   // To suppress missing implicit constructor warnings.
   factory SourceInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SourceInfo internalCreateSourceInfo() {
     return new SourceInfo._internalWrap();
   }
@@ -33338,6 +33619,7 @@
   factory SpanElement() => document.createElement("span");
 
 
+  @Deprecated("Internal Use Only")
   static SpanElement internalCreateSpanElement() {
     return new SpanElement._internalWrap();
   }
@@ -33377,6 +33659,7 @@
     return wrap_jso(_blink.BlinkSpeechGrammar.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static SpeechGrammar internalCreateSpeechGrammar() {
     return new SpeechGrammar._internalWrap();
   }
@@ -33428,6 +33711,7 @@
     return wrap_jso(_blink.BlinkSpeechGrammarList.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static SpeechGrammarList internalCreateSpeechGrammarList() {
     return new SpeechGrammarList._internalWrap();
   }
@@ -33647,6 +33931,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechRecognition internalCreateSpeechRecognition() {
     return new SpeechRecognition._internalWrap();
   }
@@ -33785,6 +34070,7 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionAlternative._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SpeechRecognitionAlternative internalCreateSpeechRecognitionAlternative() {
     return new SpeechRecognitionAlternative._internalWrap();
   }
@@ -33824,6 +34110,7 @@
   factory SpeechRecognitionError._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechRecognitionError internalCreateSpeechRecognitionError() {
     return new SpeechRecognitionError._internalWrap();
   }
@@ -33861,6 +34148,7 @@
   factory SpeechRecognitionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechRecognitionEvent internalCreateSpeechRecognitionEvent() {
     return new SpeechRecognitionEvent._internalWrap();
   }
@@ -33905,6 +34193,7 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionResult._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SpeechRecognitionResult internalCreateSpeechRecognitionResult() {
     return new SpeechRecognitionResult._internalWrap();
   }
@@ -33947,6 +34236,7 @@
   factory SpeechSynthesis._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechSynthesis internalCreateSpeechSynthesis() {
     return new SpeechSynthesis._internalWrap();
   }
@@ -34007,6 +34297,7 @@
   factory SpeechSynthesisEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechSynthesisEvent internalCreateSpeechSynthesisEvent() {
     return new SpeechSynthesisEvent._internalWrap();
   }
@@ -34123,6 +34414,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static SpeechSynthesisUtterance internalCreateSpeechSynthesisUtterance() {
     return new SpeechSynthesisUtterance._internalWrap();
   }
@@ -34233,6 +34525,7 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisVoice._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SpeechSynthesisVoice internalCreateSpeechSynthesisVoice() {
     return new SpeechSynthesisVoice._internalWrap();
   }
@@ -34357,6 +34650,7 @@
   // To suppress missing implicit constructor warnings.
   factory Storage._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Storage internalCreateStorage() {
     return new Storage._internalWrap();
   }
@@ -34461,6 +34755,7 @@
   factory StorageEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static StorageEvent internalCreateStorageEvent() {
     return new StorageEvent._internalWrap();
   }
@@ -34512,6 +34807,7 @@
   // To suppress missing implicit constructor warnings.
   factory StorageInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static StorageInfo internalCreateStorageInfo() {
     return new StorageInfo._internalWrap();
   }
@@ -34551,6 +34847,7 @@
   // To suppress missing implicit constructor warnings.
   factory StorageQuota._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static StorageQuota internalCreateStorageQuota() {
     return new StorageQuota._internalWrap();
   }
@@ -34631,6 +34928,7 @@
   factory StyleElement() => document.createElement("style");
 
 
+  @Deprecated("Internal Use Only")
   static StyleElement internalCreateStyleElement() {
     return new StyleElement._internalWrap();
   }
@@ -34692,6 +34990,7 @@
   // To suppress missing implicit constructor warnings.
   factory StyleMedia._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static StyleMedia internalCreateStyleMedia() {
     return new StyleMedia._internalWrap();
   }
@@ -34727,6 +35026,7 @@
   // To suppress missing implicit constructor warnings.
   factory StyleSheet._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static StyleSheet internalCreateStyleSheet() {
     return new StyleSheet._internalWrap();
   }
@@ -34791,6 +35091,7 @@
   factory TableCaptionElement() => document.createElement("caption");
 
 
+  @Deprecated("Internal Use Only")
   static TableCaptionElement internalCreateTableCaptionElement() {
     return new TableCaptionElement._internalWrap();
   }
@@ -34827,6 +35128,7 @@
   factory TableCellElement() => document.createElement("td");
 
 
+  @Deprecated("Internal Use Only")
   static TableCellElement internalCreateTableCellElement() {
     return new TableCellElement._internalWrap();
   }
@@ -34891,6 +35193,7 @@
   factory TableColElement() => document.createElement("col");
 
 
+  @Deprecated("Internal Use Only")
   static TableColElement internalCreateTableColElement() {
     return new TableColElement._internalWrap();
   }
@@ -34953,6 +35256,7 @@
   factory TableElement() => document.createElement("table");
 
 
+  @Deprecated("Internal Use Only")
   static TableElement internalCreateTableElement() {
     return new TableElement._internalWrap();
   }
@@ -35069,6 +35373,7 @@
   factory TableRowElement() => document.createElement("tr");
 
 
+  @Deprecated("Internal Use Only")
   static TableRowElement internalCreateTableRowElement() {
     return new TableRowElement._internalWrap();
   }
@@ -35133,6 +35438,7 @@
   factory TableSectionElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TableSectionElement internalCreateTableSectionElement() {
     return new TableSectionElement._internalWrap();
   }
@@ -35186,6 +35492,7 @@
   factory TemplateElement() => document.createElement("template");
 
 
+  @Deprecated("Internal Use Only")
   static TemplateElement internalCreateTemplateElement() {
     return new TemplateElement._internalWrap();
   }
@@ -35241,6 +35548,7 @@
   factory Text._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static Text internalCreateText() {
     return new Text._internalWrap();
   }
@@ -35284,6 +35592,7 @@
   factory TextAreaElement() => document.createElement("textarea");
 
 
+  @Deprecated("Internal Use Only")
   static TextAreaElement internalCreateTextAreaElement() {
     return new TextAreaElement._internalWrap();
   }
@@ -35529,6 +35838,7 @@
   factory TextEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TextEvent internalCreateTextEvent() {
     return new TextEvent._internalWrap();
   }
@@ -35562,6 +35872,7 @@
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TextMetrics internalCreateTextMetrics() {
     return new TextMetrics._internalWrap();
   }
@@ -35661,6 +35972,7 @@
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
 
 
+  @Deprecated("Internal Use Only")
   static TextTrack internalCreateTextTrack() {
     return new TextTrack._internalWrap();
   }
@@ -35770,6 +36082,7 @@
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
 
 
+  @Deprecated("Internal Use Only")
   static TextTrackCue internalCreateTextTrackCue() {
     return new TextTrackCue._internalWrap();
   }
@@ -35843,6 +36156,7 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCueList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TextTrackCueList internalCreateTextTrackCueList() {
     return new TextTrackCueList._internalWrap();
   }
@@ -35946,6 +36260,7 @@
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
 
+  @Deprecated("Internal Use Only")
   static TextTrackList internalCreateTextTrackList() {
     return new TextTrackList._internalWrap();
   }
@@ -36041,6 +36356,7 @@
   // To suppress missing implicit constructor warnings.
   factory TimeRanges._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TimeRanges internalCreateTimeRanges() {
     return new TimeRanges._internalWrap();
   }
@@ -36090,6 +36406,7 @@
   // To suppress missing implicit constructor warnings.
   factory Timing._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Timing internalCreateTiming() {
     return new Timing._internalWrap();
   }
@@ -36212,6 +36529,7 @@
   factory TitleElement() => document.createElement("title");
 
 
+  @Deprecated("Internal Use Only")
   static TitleElement internalCreateTitleElement() {
     return new TitleElement._internalWrap();
   }
@@ -36243,6 +36561,7 @@
   // To suppress missing implicit constructor warnings.
   factory Touch._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Touch internalCreateTouch() {
     return new Touch._internalWrap();
   }
@@ -36377,6 +36696,7 @@
   factory TouchEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TouchEvent internalCreateTouchEvent() {
     return new TouchEvent._internalWrap();
   }
@@ -36448,6 +36768,7 @@
   // To suppress missing implicit constructor warnings.
   factory TouchList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TouchList internalCreateTouchList() {
     return new TouchList._internalWrap();
   }
@@ -36542,6 +36863,7 @@
   factory TrackElement() => document.createElement("track");
 
 
+  @Deprecated("Internal Use Only")
   static TrackElement internalCreateTrackElement() {
     return new TrackElement._internalWrap();
   }
@@ -36652,6 +36974,7 @@
   factory TrackEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TrackEvent internalCreateTrackEvent() {
     return new TrackEvent._internalWrap();
   }
@@ -36682,6 +37005,7 @@
   factory TransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TransitionEvent internalCreateTransitionEvent() {
     return new TransitionEvent._internalWrap();
   }
@@ -36720,6 +37044,7 @@
   // To suppress missing implicit constructor warnings.
   factory TreeWalker._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TreeWalker internalCreateTreeWalker() {
     return new TreeWalker._internalWrap();
   }
@@ -36811,6 +37136,7 @@
   factory UIEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static UIEvent internalCreateUIEvent() {
     return new UIEvent._internalWrap();
   }
@@ -36900,6 +37226,7 @@
   factory UListElement() => document.createElement("ul");
 
 
+  @Deprecated("Internal Use Only")
   static UListElement internalCreateUListElement() {
     return new UListElement._internalWrap();
   }
@@ -36932,6 +37259,7 @@
   factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static UnknownElement internalCreateUnknownElement() {
     return new UnknownElement._internalWrap();
   }
@@ -36963,6 +37291,7 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Url internalCreateUrl() {
     return new Url._internalWrap();
   }
@@ -36980,10 +37309,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
     }
-    if ((blob_OR_source_OR_stream is MediaStream)) {
+    if ((blob_OR_source_OR_stream is MediaSource)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
     }
-    if ((blob_OR_source_OR_stream is MediaSource)) {
+    if ((blob_OR_source_OR_stream is MediaStream)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -37319,6 +37648,7 @@
   // To suppress missing implicit constructor warnings.
   factory ValidityState._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ValidityState internalCreateValidityState() {
     return new ValidityState._internalWrap();
   }
@@ -37388,6 +37718,7 @@
   factory VideoElement() => document.createElement("video");
 
 
+  @Deprecated("Internal Use Only")
   static VideoElement internalCreateVideoElement() {
     return new VideoElement._internalWrap();
   }
@@ -37487,6 +37818,7 @@
   // To suppress missing implicit constructor warnings.
   factory VideoPlaybackQuality._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static VideoPlaybackQuality internalCreateVideoPlaybackQuality() {
     return new VideoPlaybackQuality._internalWrap();
   }
@@ -37535,6 +37867,7 @@
   // To suppress missing implicit constructor warnings.
   factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static VideoTrack internalCreateVideoTrack() {
     return new VideoTrack._internalWrap();
   }
@@ -37599,6 +37932,7 @@
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
 
+  @Deprecated("Internal Use Only")
   static VideoTrackList internalCreateVideoTrackList() {
     return new VideoTrackList._internalWrap();
   }
@@ -37668,6 +38002,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static VttCue internalCreateVttCue() {
     return new VttCue._internalWrap();
   }
@@ -37785,6 +38120,7 @@
     return wrap_jso(_blink.BlinkVTTRegion.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static VttRegion internalCreateVttRegion() {
     return new VttRegion._internalWrap();
   }
@@ -37898,6 +38234,7 @@
   // To suppress missing implicit constructor warnings.
   factory VttRegionList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static VttRegionList internalCreateVttRegionList() {
     return new VttRegionList._internalWrap();
   }
@@ -38036,6 +38373,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static WebSocket internalCreateWebSocket() {
     return new WebSocket._internalWrap();
   }
@@ -38208,6 +38546,7 @@
   factory WheelEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static WheelEvent internalCreateWheelEvent() {
     return new WheelEvent._internalWrap();
   }
@@ -38548,6 +38887,7 @@
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
 
+  @Deprecated("Internal Use Only")
   static Window internalCreateWindow() {
     return new Window._internalWrap();
   }
@@ -40025,6 +40365,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static Worker internalCreateWorker() {
     return new Worker._internalWrap();
   }
@@ -40074,6 +40415,7 @@
   factory WorkerConsole._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static WorkerConsole internalCreateWorkerConsole() {
     return new WorkerConsole._internalWrap();
   }
@@ -40112,6 +40454,7 @@
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
 
+  @Deprecated("Internal Use Only")
   static WorkerGlobalScope internalCreateWorkerGlobalScope() {
     return new WorkerGlobalScope._internalWrap();
   }
@@ -40283,6 +40626,7 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static WorkerPerformance internalCreateWorkerPerformance() {
     return new WorkerPerformance._internalWrap();
   }
@@ -40328,6 +40672,7 @@
     return wrap_jso(_blink.BlinkXPathEvaluator.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static XPathEvaluator internalCreateXPathEvaluator() {
     return new XPathEvaluator._internalWrap();
   }
@@ -40369,6 +40714,7 @@
   // To suppress missing implicit constructor warnings.
   factory XPathExpression._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static XPathExpression internalCreateXPathExpression() {
     return new XPathExpression._internalWrap();
   }
@@ -40402,6 +40748,7 @@
   // To suppress missing implicit constructor warnings.
   factory XPathNSResolver._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static XPathNSResolver internalCreateXPathNSResolver() {
     return new XPathNSResolver._internalWrap();
   }
@@ -40435,6 +40782,7 @@
   // To suppress missing implicit constructor warnings.
   factory XPathResult._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static XPathResult internalCreateXPathResult() {
     return new XPathResult._internalWrap();
   }
@@ -40540,6 +40888,7 @@
   factory XmlDocument._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static XmlDocument internalCreateXmlDocument() {
     return new XmlDocument._internalWrap();
   }
@@ -40573,6 +40922,7 @@
     return wrap_jso(_blink.BlinkXMLSerializer.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static XmlSerializer internalCreateXmlSerializer() {
     return new XmlSerializer._internalWrap();
   }
@@ -40614,6 +40964,7 @@
     return wrap_jso(_blink.BlinkXSLTProcessor.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static XsltProcessor internalCreateXsltProcessor() {
     return new XsltProcessor._internalWrap();
   }
@@ -40677,6 +41028,7 @@
   factory _Attr._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _Attr internalCreate_Attr() {
     return new _Attr._internalWrap();
   }
@@ -40742,6 +41094,7 @@
   factory _CSSPrimitiveValue._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _CSSPrimitiveValue internalCreate_CSSPrimitiveValue() {
     return new _CSSPrimitiveValue._internalWrap();
   }
@@ -40770,6 +41123,7 @@
   factory _CSSUnknownRule._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _CSSUnknownRule internalCreate_CSSUnknownRule() {
     return new _CSSUnknownRule._internalWrap();
   }
@@ -40797,6 +41151,7 @@
   // To suppress missing implicit constructor warnings.
   factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _CSSValue internalCreate_CSSValue() {
     return new _CSSValue._internalWrap();
   }
@@ -40825,6 +41180,7 @@
   // To suppress missing implicit constructor warnings.
   factory _Cache._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _Cache internalCreate_Cache() {
     return new _Cache._internalWrap();
   }
@@ -40955,6 +41311,7 @@
     // To suppress missing implicit constructor warnings.
   factory _ClientRect._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _ClientRect internalCreate_ClientRect() {
     return new _ClientRect._internalWrap();
   }
@@ -41040,6 +41397,7 @@
   // To suppress missing implicit constructor warnings.
   factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _ClientRectList internalCreate_ClientRectList() {
     return new _ClientRectList._internalWrap();
   }
@@ -41123,6 +41481,7 @@
   // To suppress missing implicit constructor warnings.
   factory _Counter._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _Counter internalCreate_Counter() {
     return new _Counter._internalWrap();
   }
@@ -41150,6 +41509,7 @@
   // To suppress missing implicit constructor warnings.
   factory _CssRuleList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _CssRuleList internalCreate_CssRuleList() {
     return new _CssRuleList._internalWrap();
   }
@@ -41234,6 +41594,7 @@
   factory _CssValueList._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _CssValueList internalCreate_CssValueList() {
     return new _CssValueList._internalWrap();
   }
@@ -41316,6 +41677,7 @@
   // To suppress missing implicit constructor warnings.
   factory _DOMFileSystemSync._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _DOMFileSystemSync internalCreate_DOMFileSystemSync() {
     return new _DOMFileSystemSync._internalWrap();
   }
@@ -41346,6 +41708,7 @@
   factory _DirectoryEntrySync._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _DirectoryEntrySync internalCreate_DirectoryEntrySync() {
     return new _DirectoryEntrySync._internalWrap();
   }
@@ -41373,6 +41736,7 @@
   // To suppress missing implicit constructor warnings.
   factory _DirectoryReaderSync._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _DirectoryReaderSync internalCreate_DirectoryReaderSync() {
     return new _DirectoryReaderSync._internalWrap();
   }
@@ -41401,6 +41765,7 @@
   factory _DocumentType._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _DocumentType internalCreate_DocumentType() {
     return new _DocumentType._internalWrap();
   }
@@ -41450,6 +41815,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static _DomRect internalCreate_DomRect() {
     return new _DomRect._internalWrap();
   }
@@ -41517,6 +41883,7 @@
   // To suppress missing implicit constructor warnings.
   factory _EntrySync._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _EntrySync internalCreate_EntrySync() {
     return new _EntrySync._internalWrap();
   }
@@ -41547,6 +41914,7 @@
   factory _FileEntrySync._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _FileEntrySync internalCreate_FileEntrySync() {
     return new _FileEntrySync._internalWrap();
   }
@@ -41580,6 +41948,7 @@
     return wrap_jso(_blink.BlinkFileReaderSync.instance.constructorCallback_0_());
   }
 
+  @Deprecated("Internal Use Only")
   static _FileReaderSync internalCreate_FileReaderSync() {
     return new _FileReaderSync._internalWrap();
   }
@@ -41609,6 +41978,7 @@
   // To suppress missing implicit constructor warnings.
   factory _FileWriterSync._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _FileWriterSync internalCreate_FileWriterSync() {
     return new _FileWriterSync._internalWrap();
   }
@@ -41638,6 +42008,7 @@
   // To suppress missing implicit constructor warnings.
   factory _GamepadList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _GamepadList internalCreate_GamepadList() {
     return new _GamepadList._internalWrap();
   }
@@ -41721,6 +42092,7 @@
   // To suppress missing implicit constructor warnings.
   factory _HTMLAllCollection._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _HTMLAllCollection internalCreate_HTMLAllCollection() {
     return new _HTMLAllCollection._internalWrap();
   }
@@ -41755,6 +42127,7 @@
   factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLAppletElement internalCreate_HTMLAppletElement() {
     return new _HTMLAppletElement._internalWrap();
   }
@@ -41789,6 +42162,7 @@
   factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLDirectoryElement internalCreate_HTMLDirectoryElement() {
     return new _HTMLDirectoryElement._internalWrap();
   }
@@ -41823,6 +42197,7 @@
   factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLFontElement internalCreate_HTMLFontElement() {
     return new _HTMLFontElement._internalWrap();
   }
@@ -41857,6 +42232,7 @@
   factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLFrameElement internalCreate_HTMLFrameElement() {
     return new _HTMLFrameElement._internalWrap();
   }
@@ -41889,6 +42265,7 @@
   factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLFrameSetElement internalCreate_HTMLFrameSetElement() {
     return new _HTMLFrameSetElement._internalWrap();
   }
@@ -41932,6 +42309,7 @@
   factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _HTMLMarqueeElement internalCreate_HTMLMarqueeElement() {
     return new _HTMLMarqueeElement._internalWrap();
   }
@@ -41972,6 +42350,7 @@
   factory _MutationEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _MutationEvent internalCreate_MutationEvent() {
     return new _MutationEvent._internalWrap();
   }
@@ -41999,6 +42378,7 @@
   // To suppress missing implicit constructor warnings.
   factory _NamedNodeMap._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _NamedNodeMap internalCreate_NamedNodeMap() {
     return new _NamedNodeMap._internalWrap();
   }
@@ -42109,6 +42489,7 @@
   // To suppress missing implicit constructor warnings.
   factory _PagePopupController._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _PagePopupController internalCreate_PagePopupController() {
     return new _PagePopupController._internalWrap();
   }
@@ -42138,6 +42519,7 @@
   // To suppress missing implicit constructor warnings.
   factory _RGBColor._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _RGBColor internalCreate_RGBColor() {
     return new _RGBColor._internalWrap();
   }
@@ -42163,6 +42545,7 @@
   factory _RadioNodeList._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _RadioNodeList internalCreate_RadioNodeList() {
     return new _RadioNodeList._internalWrap();
   }
@@ -42190,6 +42573,7 @@
   // To suppress missing implicit constructor warnings.
   factory _Rect._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _Rect internalCreate_Rect() {
     return new _Rect._internalWrap();
   }
@@ -42239,6 +42623,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static _Request internalCreate_Request() {
     return new _Request._internalWrap();
   }
@@ -42330,6 +42715,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static _Response internalCreate_Response() {
     return new _Response._internalWrap();
   }
@@ -42355,6 +42741,7 @@
   factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _ServiceWorker internalCreate_ServiceWorker() {
     return new _ServiceWorker._internalWrap();
   }
@@ -42385,6 +42772,7 @@
   // To suppress missing implicit constructor warnings.
   factory _SpeechRecognitionResultList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _SpeechRecognitionResultList internalCreate_SpeechRecognitionResultList() {
     return new _SpeechRecognitionResultList._internalWrap();
   }
@@ -42466,6 +42854,7 @@
   // To suppress missing implicit constructor warnings.
   factory _StyleSheetList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _StyleSheetList internalCreate_StyleSheetList() {
     return new _StyleSheetList._internalWrap();
   }
@@ -42552,6 +42941,7 @@
   // To suppress missing implicit constructor warnings.
   factory _SubtleCrypto._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _SubtleCrypto internalCreate_SubtleCrypto() {
     return new _SubtleCrypto._internalWrap();
   }
@@ -42582,6 +42972,7 @@
   factory _WebKitCSSFilterValue._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _WebKitCSSFilterValue internalCreate_WebKitCSSFilterValue() {
     return new _WebKitCSSFilterValue._internalWrap();
   }
@@ -42618,6 +43009,7 @@
     return wrap_jso(_blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue));
   }
 
+  @Deprecated("Internal Use Only")
   static _WebKitCSSMatrix internalCreate_WebKitCSSMatrix() {
     return new _WebKitCSSMatrix._internalWrap();
   }
@@ -42648,6 +43040,7 @@
   factory _WebKitCSSTransformValue._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _WebKitCSSTransformValue internalCreate_WebKitCSSTransformValue() {
     return new _WebKitCSSTransformValue._internalWrap();
   }
@@ -42708,6 +43101,7 @@
   // To suppress missing implicit constructor warnings.
   factory _WorkerLocation._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _WorkerLocation internalCreate_WorkerLocation() {
     return new _WorkerLocation._internalWrap();
   }
@@ -42746,6 +43140,7 @@
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static _WorkerNavigator internalCreate_WorkerNavigator() {
     return new _WorkerNavigator._internalWrap();
   }
@@ -42786,6 +43181,7 @@
   factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _XMLHttpRequestProgressEvent internalCreate_XMLHttpRequestProgressEvent() {
     return new _XMLHttpRequestProgressEvent._internalWrap();
   }
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index cb17178..fcb4e1d 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -108,6 +108,7 @@
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final indexed_dbBlinkMap = {
   'IDBCursor': () => Cursor,
   'IDBCursorWithValue': () => CursorWithValue,
@@ -124,6 +125,7 @@
 };
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final indexed_dbBlinkFunctionMap = {
   'IDBCursor': () => Cursor.internalCreateCursor,
   'IDBCursorWithValue': () => CursorWithValue.internalCreateCursorWithValue,
@@ -167,6 +169,7 @@
     // To suppress missing implicit constructor warnings.
   factory Cursor._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Cursor internalCreateCursor() {
     return new Cursor._internalWrap();
   }
@@ -238,6 +241,7 @@
   factory CursorWithValue._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static CursorWithValue internalCreateCursorWithValue() {
     return new CursorWithValue._internalWrap();
   }
@@ -333,6 +337,7 @@
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
 
 
+  @Deprecated("Internal Use Only")
   static Database internalCreateDatabase() {
     return new Database._internalWrap();
   }
@@ -526,6 +531,7 @@
   // To suppress missing implicit constructor warnings.
   factory IdbFactory._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static IdbFactory internalCreateIdbFactory() {
     return new IdbFactory._internalWrap();
   }
@@ -677,6 +683,7 @@
     // To suppress missing implicit constructor warnings.
   factory Index._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Index internalCreateIndex() {
     return new Index._internalWrap();
   }
@@ -766,6 +773,7 @@
   // To suppress missing implicit constructor warnings.
   factory KeyRange._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static KeyRange internalCreateKeyRange() {
     return new KeyRange._internalWrap();
   }
@@ -963,6 +971,7 @@
   // To suppress missing implicit constructor warnings.
   factory ObjectStore._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ObjectStore internalCreateObjectStore() {
     return new ObjectStore._internalWrap();
   }
@@ -1127,6 +1136,7 @@
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
 
+  @Deprecated("Internal Use Only")
   static OpenDBRequest internalCreateOpenDBRequest() {
     return new OpenDBRequest._internalWrap();
   }
@@ -1184,6 +1194,7 @@
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
 
 
+  @Deprecated("Internal Use Only")
   static Request internalCreateRequest() {
     return new Request._internalWrap();
   }
@@ -1297,6 +1308,7 @@
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
 
+  @Deprecated("Internal Use Only")
   static Transaction internalCreateTransaction() {
     return new Transaction._internalWrap();
   }
@@ -1359,6 +1371,7 @@
   factory VersionChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static VersionChangeEvent internalCreateVersionChangeEvent() {
     return new VersionChangeEvent._internalWrap();
   }
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index f2ab9c4..eeecd93 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -207,7 +207,6 @@
  * Temporary method that we hope to remove at some point. This method should
  * generally only be called by machine generated code.
  */
-
 void registerJsInterfaces([List<Type> classes]) {
   // This method is now obsolete in Dartium.
 }
@@ -301,6 +300,7 @@
 String _accessJsPath(String path) =>
     "${_JS_LIBRARY_PREFIX}.context${path.split(".").map((p) => "['$p']").join('')}";
 
+@Deprecated("Internal Use Only")
 void addMemberHelper(mirrors.MethodMirror declaration, String path, StringBuffer sb, {bool isStatic: false, String memberName}) {
   var jsName = _getJsMemberName(declaration);
   path = (path != null && path.isNotEmpty) ? "${path}.${jsName}" : jsName;
@@ -717,6 +717,7 @@
  * we can access it from other libraries without it being
  * a public instance field on JsObject.
  */
+@Deprecated("Internal Use Only")
 getDartHtmlWrapperFor(JsObject object) => object._dartHtmlWrapper;
 
 /**
@@ -724,6 +725,7 @@
  * we can access it from other libraries without it being
  * a public instance field on JsObject.
  */
+@Deprecated("Internal Use Only")
 void setDartHtmlWrapperFor(JsObject object, wrapper) {
   object._dartHtmlWrapper = wrapper;
 }
@@ -733,6 +735,7 @@
  * argument is a Dart class instance that delegates to a DOM object.  See
  * wrap_jso defined in dart:html.
  */
+@Deprecated("Internal Use Only")
 unwrap_jso(dartClass_instance) {
   if (dartClass_instance is html.DartHtmlDomObject)
     return dartClass_instance.blink_jsObject;
@@ -977,6 +980,7 @@
 
 // JavaScript interop methods that do not automatically wrap to dart:html types.
 // Warning: this API is not exposed to dart:js.
+@Deprecated("Internal Use Only")
 class JsNative {
   static getProperty(JsObject o, name) {
     return o._operator_getter(name);
@@ -1160,13 +1164,31 @@
         a9 = _UNDEFINED, a10 = _UNDEFINED]) => jsFunction._applyDebuggerOnly(
             _stripUndefinedArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]));
 
-// This method is a no-op in Dartium.
+// The allowInterop method is a no-op in Dartium.
 // TODO(jacobr): tag methods so we can throw if a Dart method is passed to
 // JavaScript using the new interop without calling allowInterop.
+
+/// Returns a wrapper around function [f] that can be called from JavaScript
+/// using the package:js Dart-JavaScript interop.
+///
+/// For performance reasons in Dart2Js, by default Dart functions cannot be
+/// passed directly to JavaScript unless this method is called to create
+/// a Function compatible with both Dart and JavaScript.
+/// Calling this method repeatedly on a function will return the same function.
+/// The [Function] returned by this method can be used from both Dart and
+/// JavaScript. We may remove the need to call this method completely in the
+/// future if Dart2Js is refactored so that its function calling conventions
+/// are more compatible with JavaScript.
 Function allowInterop(Function f) => f;
 
 Expando<JsFunction> _interopCaptureThisExpando = new Expando<JsFunction>();
 
+/// Returns a [Function] that when called from JavaScript captures its 'this'
+/// binding and calls [f] with the value of this passed as the first argument.
+/// When called from Dart, [null] will be passed as the first argument.
+///
+/// See the documention for [allowInterop]. This method should only be used with
+/// package:js Dart-JavaScript interop.
 Function allowInteropCaptureThis(Function f) {
   if (f is JsFunction) {
     // Behavior when the function is already a JS function is unspecified.
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 71ed0c6..7da3402 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -24,6 +24,7 @@
 
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final svgBlinkMap = {
   'SVGAElement': () => AElement,
   'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement,
@@ -171,6 +172,7 @@
 };
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final svgBlinkFunctionMap = {
   'SVGAElement': () => AElement.internalCreateAElement,
   'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement.internalCreate_SVGAltGlyphDefElement,
@@ -342,6 +344,7 @@
   factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
 
 
+  @Deprecated("Internal Use Only")
   static AElement internalCreateAElement() {
     return new AElement._internalWrap();
   }
@@ -390,6 +393,7 @@
   factory AltGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("altGlyph");
 
 
+  @Deprecated("Internal Use Only")
   static AltGlyphElement internalCreateAltGlyphElement() {
     return new AltGlyphElement._internalWrap();
   }
@@ -445,6 +449,7 @@
   // To suppress missing implicit constructor warnings.
   factory Angle._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Angle internalCreateAngle() {
     return new Angle._internalWrap();
   }
@@ -537,6 +542,7 @@
   factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
 
 
+  @Deprecated("Internal Use Only")
   static AnimateElement internalCreateAnimateElement() {
     return new AnimateElement._internalWrap();
   }
@@ -580,6 +586,7 @@
   factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
 
 
+  @Deprecated("Internal Use Only")
   static AnimateMotionElement internalCreateAnimateMotionElement() {
     return new AnimateMotionElement._internalWrap();
   }
@@ -623,6 +630,7 @@
   factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
 
 
+  @Deprecated("Internal Use Only")
   static AnimateTransformElement internalCreateAnimateTransformElement() {
     return new AnimateTransformElement._internalWrap();
   }
@@ -658,6 +666,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedAngle._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedAngle internalCreateAnimatedAngle() {
     return new AnimatedAngle._internalWrap();
   }
@@ -694,6 +703,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedBoolean._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedBoolean internalCreateAnimatedBoolean() {
     return new AnimatedBoolean._internalWrap();
   }
@@ -734,6 +744,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedEnumeration._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedEnumeration internalCreateAnimatedEnumeration() {
     return new AnimatedEnumeration._internalWrap();
   }
@@ -774,6 +785,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedInteger._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedInteger internalCreateAnimatedInteger() {
     return new AnimatedInteger._internalWrap();
   }
@@ -814,6 +826,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLength._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedLength internalCreateAnimatedLength() {
     return new AnimatedLength._internalWrap();
   }
@@ -850,6 +863,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLengthList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedLengthList internalCreateAnimatedLengthList() {
     return new AnimatedLengthList._internalWrap();
   }
@@ -886,6 +900,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumber._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedNumber internalCreateAnimatedNumber() {
     return new AnimatedNumber._internalWrap();
   }
@@ -926,6 +941,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumberList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedNumberList internalCreateAnimatedNumberList() {
     return new AnimatedNumberList._internalWrap();
   }
@@ -962,6 +978,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedPreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedPreserveAspectRatio internalCreateAnimatedPreserveAspectRatio() {
     return new AnimatedPreserveAspectRatio._internalWrap();
   }
@@ -998,6 +1015,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedRect._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedRect internalCreateAnimatedRect() {
     return new AnimatedRect._internalWrap();
   }
@@ -1034,6 +1052,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedString._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedString internalCreateAnimatedString() {
     return new AnimatedString._internalWrap();
   }
@@ -1074,6 +1093,7 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedTransformList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AnimatedTransformList internalCreateAnimatedTransformList() {
     return new AnimatedTransformList._internalWrap();
   }
@@ -1115,6 +1135,7 @@
   factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
 
 
+  @Deprecated("Internal Use Only")
   static AnimationElement internalCreateAnimationElement() {
     return new AnimationElement._internalWrap();
   }
@@ -1200,6 +1221,7 @@
   factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
 
 
+  @Deprecated("Internal Use Only")
   static CircleElement internalCreateCircleElement() {
     return new CircleElement._internalWrap();
   }
@@ -1249,6 +1271,7 @@
   factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
 
 
+  @Deprecated("Internal Use Only")
   static ClipPathElement internalCreateClipPathElement() {
     return new ClipPathElement._internalWrap();
   }
@@ -1290,6 +1313,7 @@
   factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
 
 
+  @Deprecated("Internal Use Only")
   static DefsElement internalCreateDefsElement() {
     return new DefsElement._internalWrap();
   }
@@ -1327,6 +1351,7 @@
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
 
 
+  @Deprecated("Internal Use Only")
   static DescElement internalCreateDescElement() {
     return new DescElement._internalWrap();
   }
@@ -1360,6 +1385,7 @@
   factory DiscardElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DiscardElement internalCreateDiscardElement() {
     return new DiscardElement._internalWrap();
   }
@@ -1397,6 +1423,7 @@
   factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
 
 
+  @Deprecated("Internal Use Only")
   static EllipseElement internalCreateEllipseElement() {
     return new EllipseElement._internalWrap();
   }
@@ -1454,6 +1481,7 @@
   factory FEBlendElement() => _SvgElementFactoryProvider.createSvgElement_tag("feBlend");
 
 
+  @Deprecated("Internal Use Only")
   static FEBlendElement internalCreateFEBlendElement() {
     return new FEBlendElement._internalWrap();
   }
@@ -1554,6 +1582,7 @@
   factory FEColorMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix");
 
 
+  @Deprecated("Internal Use Only")
   static FEColorMatrixElement internalCreateFEColorMatrixElement() {
     return new FEColorMatrixElement._internalWrap();
   }
@@ -1650,6 +1679,7 @@
   factory FEComponentTransferElement() => _SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer");
 
 
+  @Deprecated("Internal Use Only")
   static FEComponentTransferElement internalCreateFEComponentTransferElement() {
     return new FEComponentTransferElement._internalWrap();
   }
@@ -1710,6 +1740,7 @@
   factory FECompositeElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FECompositeElement internalCreateFECompositeElement() {
     return new FECompositeElement._internalWrap();
   }
@@ -1827,6 +1858,7 @@
   factory FEConvolveMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix");
 
 
+  @Deprecated("Internal Use Only")
   static FEConvolveMatrixElement internalCreateFEConvolveMatrixElement() {
     return new FEConvolveMatrixElement._internalWrap();
   }
@@ -1955,6 +1987,7 @@
   factory FEDiffuseLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting");
 
 
+  @Deprecated("Internal Use Only")
   static FEDiffuseLightingElement internalCreateFEDiffuseLightingElement() {
     return new FEDiffuseLightingElement._internalWrap();
   }
@@ -2039,6 +2072,7 @@
   factory FEDisplacementMapElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap");
 
 
+  @Deprecated("Internal Use Only")
   static FEDisplacementMapElement internalCreateFEDisplacementMapElement() {
     return new FEDisplacementMapElement._internalWrap();
   }
@@ -2143,6 +2177,7 @@
   factory FEDistantLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDistantLight");
 
 
+  @Deprecated("Internal Use Only")
   static FEDistantLightElement internalCreateFEDistantLightElement() {
     return new FEDistantLightElement._internalWrap();
   }
@@ -2195,6 +2230,7 @@
   factory FEFloodElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFlood");
 
 
+  @Deprecated("Internal Use Only")
   static FEFloodElement internalCreateFEFloodElement() {
     return new FEFloodElement._internalWrap();
   }
@@ -2259,6 +2295,7 @@
   factory FEFuncAElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncA");
 
 
+  @Deprecated("Internal Use Only")
   static FEFuncAElement internalCreateFEFuncAElement() {
     return new FEFuncAElement._internalWrap();
   }
@@ -2303,6 +2340,7 @@
   factory FEFuncBElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncB");
 
 
+  @Deprecated("Internal Use Only")
   static FEFuncBElement internalCreateFEFuncBElement() {
     return new FEFuncBElement._internalWrap();
   }
@@ -2347,6 +2385,7 @@
   factory FEFuncGElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncG");
 
 
+  @Deprecated("Internal Use Only")
   static FEFuncGElement internalCreateFEFuncGElement() {
     return new FEFuncGElement._internalWrap();
   }
@@ -2391,6 +2430,7 @@
   factory FEFuncRElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncR");
 
 
+  @Deprecated("Internal Use Only")
   static FEFuncRElement internalCreateFEFuncRElement() {
     return new FEFuncRElement._internalWrap();
   }
@@ -2435,6 +2475,7 @@
   factory FEGaussianBlurElement() => _SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur");
 
 
+  @Deprecated("Internal Use Only")
   static FEGaussianBlurElement internalCreateFEGaussianBlurElement() {
     return new FEGaussianBlurElement._internalWrap();
   }
@@ -2515,6 +2556,7 @@
   factory FEImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("feImage");
 
 
+  @Deprecated("Internal Use Only")
   static FEImageElement internalCreateFEImageElement() {
     return new FEImageElement._internalWrap();
   }
@@ -2587,6 +2629,7 @@
   factory FEMergeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMerge");
 
 
+  @Deprecated("Internal Use Only")
   static FEMergeElement internalCreateFEMergeElement() {
     return new FEMergeElement._internalWrap();
   }
@@ -2651,6 +2694,7 @@
   factory FEMergeNodeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMergeNode");
 
 
+  @Deprecated("Internal Use Only")
   static FEMergeNodeElement internalCreateFEMergeNodeElement() {
     return new FEMergeNodeElement._internalWrap();
   }
@@ -2695,6 +2739,7 @@
   factory FEMorphologyElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static FEMorphologyElement internalCreateFEMorphologyElement() {
     return new FEMorphologyElement._internalWrap();
   }
@@ -2784,6 +2829,7 @@
   factory FEOffsetElement() => _SvgElementFactoryProvider.createSvgElement_tag("feOffset");
 
 
+  @Deprecated("Internal Use Only")
   static FEOffsetElement internalCreateFEOffsetElement() {
     return new FEOffsetElement._internalWrap();
   }
@@ -2860,6 +2906,7 @@
   factory FEPointLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("fePointLight");
 
 
+  @Deprecated("Internal Use Only")
   static FEPointLightElement internalCreateFEPointLightElement() {
     return new FEPointLightElement._internalWrap();
   }
@@ -2916,6 +2963,7 @@
   factory FESpecularLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting");
 
 
+  @Deprecated("Internal Use Only")
   static FESpecularLightingElement internalCreateFESpecularLightingElement() {
     return new FESpecularLightingElement._internalWrap();
   }
@@ -2996,6 +3044,7 @@
   factory FESpotLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpotLight");
 
 
+  @Deprecated("Internal Use Only")
   static FESpotLightElement internalCreateFESpotLightElement() {
     return new FESpotLightElement._internalWrap();
   }
@@ -3072,6 +3121,7 @@
   factory FETileElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTile");
 
 
+  @Deprecated("Internal Use Only")
   static FETileElement internalCreateFETileElement() {
     return new FETileElement._internalWrap();
   }
@@ -3140,6 +3190,7 @@
   factory FETurbulenceElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTurbulence");
 
 
+  @Deprecated("Internal Use Only")
   static FETurbulenceElement internalCreateFETurbulenceElement() {
     return new FETurbulenceElement._internalWrap();
   }
@@ -3252,6 +3303,7 @@
   factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
 
 
+  @Deprecated("Internal Use Only")
   static FilterElement internalCreateFilterElement() {
     return new FilterElement._internalWrap();
   }
@@ -3393,6 +3445,7 @@
   factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
 
 
+  @Deprecated("Internal Use Only")
   static ForeignObjectElement internalCreateForeignObjectElement() {
     return new ForeignObjectElement._internalWrap();
   }
@@ -3449,6 +3502,7 @@
   factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
 
 
+  @Deprecated("Internal Use Only")
   static GElement internalCreateGElement() {
     return new GElement._internalWrap();
   }
@@ -3482,6 +3536,7 @@
   factory GeometryElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static GeometryElement internalCreateGeometryElement() {
     return new GeometryElement._internalWrap();
   }
@@ -3525,6 +3580,7 @@
   factory GraphicsElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static GraphicsElement internalCreateGraphicsElement() {
     return new GraphicsElement._internalWrap();
   }
@@ -3617,6 +3673,7 @@
   factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
 
 
+  @Deprecated("Internal Use Only")
   static ImageElement internalCreateImageElement() {
     return new ImageElement._internalWrap();
   }
@@ -3673,6 +3730,7 @@
   // To suppress missing implicit constructor warnings.
   factory Length._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Length internalCreateLength() {
     return new Length._internalWrap();
   }
@@ -3781,6 +3839,7 @@
   // To suppress missing implicit constructor warnings.
   factory LengthList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static LengthList internalCreateLengthList() {
     return new LengthList._internalWrap();
   }
@@ -3900,6 +3959,7 @@
   factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
 
 
+  @Deprecated("Internal Use Only")
   static LineElement internalCreateLineElement() {
     return new LineElement._internalWrap();
   }
@@ -3953,6 +4013,7 @@
   factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
 
 
+  @Deprecated("Internal Use Only")
   static LinearGradientElement internalCreateLinearGradientElement() {
     return new LinearGradientElement._internalWrap();
   }
@@ -4006,6 +4067,7 @@
   factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
 
 
+  @Deprecated("Internal Use Only")
   static MarkerElement internalCreateMarkerElement() {
     return new MarkerElement._internalWrap();
   }
@@ -4111,6 +4173,7 @@
   factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
 
 
+  @Deprecated("Internal Use Only")
   static MaskElement internalCreateMaskElement() {
     return new MaskElement._internalWrap();
   }
@@ -4183,6 +4246,7 @@
   // To suppress missing implicit constructor warnings.
   factory Matrix._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Matrix internalCreateMatrix() {
     return new Matrix._internalWrap();
   }
@@ -4304,6 +4368,7 @@
   factory MetadataElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MetadataElement internalCreateMetadataElement() {
     return new MetadataElement._internalWrap();
   }
@@ -4336,6 +4401,7 @@
   // To suppress missing implicit constructor warnings.
   factory Number._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Number internalCreateNumber() {
     return new Number._internalWrap();
   }
@@ -4372,6 +4438,7 @@
   // To suppress missing implicit constructor warnings.
   factory NumberList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static NumberList internalCreateNumberList() {
     return new NumberList._internalWrap();
   }
@@ -4491,6 +4558,7 @@
   factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
 
 
+  @Deprecated("Internal Use Only")
   static PathElement internalCreatePathElement() {
     return new PathElement._internalWrap();
   }
@@ -4631,6 +4699,7 @@
   // To suppress missing implicit constructor warnings.
   factory PathSeg._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PathSeg internalCreatePathSeg() {
     return new PathSeg._internalWrap();
   }
@@ -4748,6 +4817,7 @@
   factory PathSegArcAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegArcAbs internalCreatePathSegArcAbs() {
     return new PathSegArcAbs._internalWrap();
   }
@@ -4831,6 +4901,7 @@
   factory PathSegArcRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegArcRel internalCreatePathSegArcRel() {
     return new PathSegArcRel._internalWrap();
   }
@@ -4914,6 +4985,7 @@
   factory PathSegClosePath._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegClosePath internalCreatePathSegClosePath() {
     return new PathSegClosePath._internalWrap();
   }
@@ -4941,6 +5013,7 @@
   factory PathSegCurvetoCubicAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoCubicAbs internalCreatePathSegCurvetoCubicAbs() {
     return new PathSegCurvetoCubicAbs._internalWrap();
   }
@@ -5016,6 +5089,7 @@
   factory PathSegCurvetoCubicRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoCubicRel internalCreatePathSegCurvetoCubicRel() {
     return new PathSegCurvetoCubicRel._internalWrap();
   }
@@ -5091,6 +5165,7 @@
   factory PathSegCurvetoCubicSmoothAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoCubicSmoothAbs internalCreatePathSegCurvetoCubicSmoothAbs() {
     return new PathSegCurvetoCubicSmoothAbs._internalWrap();
   }
@@ -5150,6 +5225,7 @@
   factory PathSegCurvetoCubicSmoothRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoCubicSmoothRel internalCreatePathSegCurvetoCubicSmoothRel() {
     return new PathSegCurvetoCubicSmoothRel._internalWrap();
   }
@@ -5209,6 +5285,7 @@
   factory PathSegCurvetoQuadraticAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoQuadraticAbs internalCreatePathSegCurvetoQuadraticAbs() {
     return new PathSegCurvetoQuadraticAbs._internalWrap();
   }
@@ -5268,6 +5345,7 @@
   factory PathSegCurvetoQuadraticRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoQuadraticRel internalCreatePathSegCurvetoQuadraticRel() {
     return new PathSegCurvetoQuadraticRel._internalWrap();
   }
@@ -5327,6 +5405,7 @@
   factory PathSegCurvetoQuadraticSmoothAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoQuadraticSmoothAbs internalCreatePathSegCurvetoQuadraticSmoothAbs() {
     return new PathSegCurvetoQuadraticSmoothAbs._internalWrap();
   }
@@ -5370,6 +5449,7 @@
   factory PathSegCurvetoQuadraticSmoothRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegCurvetoQuadraticSmoothRel internalCreatePathSegCurvetoQuadraticSmoothRel() {
     return new PathSegCurvetoQuadraticSmoothRel._internalWrap();
   }
@@ -5413,6 +5493,7 @@
   factory PathSegLinetoAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoAbs internalCreatePathSegLinetoAbs() {
     return new PathSegLinetoAbs._internalWrap();
   }
@@ -5456,6 +5537,7 @@
   factory PathSegLinetoHorizontalAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoHorizontalAbs internalCreatePathSegLinetoHorizontalAbs() {
     return new PathSegLinetoHorizontalAbs._internalWrap();
   }
@@ -5491,6 +5573,7 @@
   factory PathSegLinetoHorizontalRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoHorizontalRel internalCreatePathSegLinetoHorizontalRel() {
     return new PathSegLinetoHorizontalRel._internalWrap();
   }
@@ -5526,6 +5609,7 @@
   factory PathSegLinetoRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoRel internalCreatePathSegLinetoRel() {
     return new PathSegLinetoRel._internalWrap();
   }
@@ -5569,6 +5653,7 @@
   factory PathSegLinetoVerticalAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoVerticalAbs internalCreatePathSegLinetoVerticalAbs() {
     return new PathSegLinetoVerticalAbs._internalWrap();
   }
@@ -5604,6 +5689,7 @@
   factory PathSegLinetoVerticalRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegLinetoVerticalRel internalCreatePathSegLinetoVerticalRel() {
     return new PathSegLinetoVerticalRel._internalWrap();
   }
@@ -5638,6 +5724,7 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PathSegList internalCreatePathSegList() {
     return new PathSegList._internalWrap();
   }
@@ -5753,6 +5840,7 @@
   factory PathSegMovetoAbs._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegMovetoAbs internalCreatePathSegMovetoAbs() {
     return new PathSegMovetoAbs._internalWrap();
   }
@@ -5796,6 +5884,7 @@
   factory PathSegMovetoRel._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PathSegMovetoRel internalCreatePathSegMovetoRel() {
     return new PathSegMovetoRel._internalWrap();
   }
@@ -5843,6 +5932,7 @@
   factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
 
 
+  @Deprecated("Internal Use Only")
   static PatternElement internalCreatePatternElement() {
     return new PatternElement._internalWrap();
   }
@@ -5931,6 +6021,7 @@
   // To suppress missing implicit constructor warnings.
   factory Point._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Point internalCreatePoint() {
     return new Point._internalWrap();
   }
@@ -5979,6 +6070,7 @@
   // To suppress missing implicit constructor warnings.
   factory PointList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PointList internalCreatePointList() {
     return new PointList._internalWrap();
   }
@@ -6054,6 +6146,7 @@
   factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
 
 
+  @Deprecated("Internal Use Only")
   static PolygonElement internalCreatePolygonElement() {
     return new PolygonElement._internalWrap();
   }
@@ -6099,6 +6192,7 @@
   factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
 
 
+  @Deprecated("Internal Use Only")
   static PolylineElement internalCreatePolylineElement() {
     return new PolylineElement._internalWrap();
   }
@@ -6139,6 +6233,7 @@
   // To suppress missing implicit constructor warnings.
   factory PreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PreserveAspectRatio internalCreatePreserveAspectRatio() {
     return new PreserveAspectRatio._internalWrap();
   }
@@ -6244,6 +6339,7 @@
   factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
 
 
+  @Deprecated("Internal Use Only")
   static RadialGradientElement internalCreateRadialGradientElement() {
     return new RadialGradientElement._internalWrap();
   }
@@ -6300,6 +6396,7 @@
   // To suppress missing implicit constructor warnings.
   factory Rect._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Rect internalCreateRect() {
     return new Rect._internalWrap();
   }
@@ -6365,6 +6462,7 @@
   factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
 
 
+  @Deprecated("Internal Use Only")
   static RectElement internalCreateRectElement() {
     return new RectElement._internalWrap();
   }
@@ -6421,6 +6519,7 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingIntent._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static RenderingIntent internalCreateRenderingIntent() {
     return new RenderingIntent._internalWrap();
   }
@@ -6478,6 +6577,7 @@
   factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
 
 
+  @Deprecated("Internal Use Only")
   static ScriptElement internalCreateScriptElement() {
     return new ScriptElement._internalWrap();
   }
@@ -6530,6 +6630,7 @@
   factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
 
 
+  @Deprecated("Internal Use Only")
   static SetElement internalCreateSetElement() {
     return new SetElement._internalWrap();
   }
@@ -6570,6 +6671,7 @@
   factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
 
 
+  @Deprecated("Internal Use Only")
   static StopElement internalCreateStopElement() {
     return new StopElement._internalWrap();
   }
@@ -6606,6 +6708,7 @@
   // To suppress missing implicit constructor warnings.
   factory StringList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static StringList internalCreateStringList() {
     return new StringList._internalWrap();
   }
@@ -6726,6 +6829,7 @@
   factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
 
 
+  @Deprecated("Internal Use Only")
   static StyleElement internalCreateStyleElement() {
     return new StyleElement._internalWrap();
   }
@@ -7205,6 +7309,7 @@
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
 
+  @Deprecated("Internal Use Only")
   static SvgElement internalCreateSvgElement() {
     return new SvgElement._internalWrap();
   }
@@ -7558,6 +7663,7 @@
   factory SvgSvgElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static SvgSvgElement internalCreateSvgSvgElement() {
     return new SvgSvgElement._internalWrap();
   }
@@ -7759,6 +7865,7 @@
   factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
 
 
+  @Deprecated("Internal Use Only")
   static SwitchElement internalCreateSwitchElement() {
     return new SwitchElement._internalWrap();
   }
@@ -7796,6 +7903,7 @@
   factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
 
 
+  @Deprecated("Internal Use Only")
   static SymbolElement internalCreateSymbolElement() {
     return new SymbolElement._internalWrap();
   }
@@ -7841,6 +7949,7 @@
   factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
 
 
+  @Deprecated("Internal Use Only")
   static TSpanElement internalCreateTSpanElement() {
     return new TSpanElement._internalWrap();
   }
@@ -7905,6 +8014,7 @@
   factory TextContentElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TextContentElement internalCreateTextContentElement() {
     return new TextContentElement._internalWrap();
   }
@@ -7998,6 +8108,7 @@
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
 
 
+  @Deprecated("Internal Use Only")
   static TextElement internalCreateTextElement() {
     return new TextElement._internalWrap();
   }
@@ -8031,6 +8142,7 @@
   factory TextPathElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TextPathElement internalCreateTextPathElement() {
     return new TextPathElement._internalWrap();
   }
@@ -8104,6 +8216,7 @@
   factory TextPositioningElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static TextPositioningElement internalCreateTextPositioningElement() {
     return new TextPositioningElement._internalWrap();
   }
@@ -8161,6 +8274,7 @@
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
 
 
+  @Deprecated("Internal Use Only")
   static TitleElement internalCreateTitleElement() {
     return new TitleElement._internalWrap();
   }
@@ -8193,6 +8307,7 @@
   // To suppress missing implicit constructor warnings.
   factory Transform._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Transform internalCreateTransform() {
     return new Transform._internalWrap();
   }
@@ -8285,6 +8400,7 @@
   // To suppress missing implicit constructor warnings.
   factory TransformList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static TransformList internalCreateTransformList() {
     return new TransformList._internalWrap();
   }
@@ -8407,6 +8523,7 @@
   // To suppress missing implicit constructor warnings.
   factory UnitTypes._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static UnitTypes internalCreateUnitTypes() {
     return new UnitTypes._internalWrap();
   }
@@ -8471,6 +8588,7 @@
   factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
 
 
+  @Deprecated("Internal Use Only")
   static UseElement internalCreateUseElement() {
     return new UseElement._internalWrap();
   }
@@ -8528,6 +8646,7 @@
   factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
 
 
+  @Deprecated("Internal Use Only")
   static ViewElement internalCreateViewElement() {
     return new ViewElement._internalWrap();
   }
@@ -8580,6 +8699,7 @@
   // To suppress missing implicit constructor warnings.
   factory ViewSpec._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ViewSpec internalCreateViewSpec() {
     return new ViewSpec._internalWrap();
   }
@@ -8688,6 +8808,7 @@
   factory ZoomEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ZoomEvent internalCreateZoomEvent() {
     return new ZoomEvent._internalWrap();
   }
@@ -8735,6 +8856,7 @@
   factory _GradientElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _GradientElement internalCreate_GradientElement() {
     return new _GradientElement._internalWrap();
   }
@@ -8800,6 +8922,7 @@
   factory _SVGAltGlyphDefElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGAltGlyphDefElement internalCreate_SVGAltGlyphDefElement() {
     return new _SVGAltGlyphDefElement._internalWrap();
   }
@@ -8833,6 +8956,7 @@
   factory _SVGAltGlyphItemElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGAltGlyphItemElement internalCreate_SVGAltGlyphItemElement() {
     return new _SVGAltGlyphItemElement._internalWrap();
   }
@@ -8866,6 +8990,7 @@
   factory _SVGComponentTransferFunctionElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGComponentTransferFunctionElement internalCreate_SVGComponentTransferFunctionElement() {
     return new _SVGComponentTransferFunctionElement._internalWrap();
   }
@@ -8901,6 +9026,7 @@
   factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
 
 
+  @Deprecated("Internal Use Only")
   static _SVGCursorElement internalCreate_SVGCursorElement() {
     return new _SVGCursorElement._internalWrap();
   }
@@ -8942,6 +9068,7 @@
   factory _SVGFEDropShadowElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFEDropShadowElement internalCreate_SVGFEDropShadowElement() {
     return new _SVGFEDropShadowElement._internalWrap();
   }
@@ -8982,6 +9109,7 @@
   factory _SVGFontElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontElement internalCreate_SVGFontElement() {
     return new _SVGFontElement._internalWrap();
   }
@@ -9015,6 +9143,7 @@
   factory _SVGFontFaceElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontFaceElement internalCreate_SVGFontFaceElement() {
     return new _SVGFontFaceElement._internalWrap();
   }
@@ -9048,6 +9177,7 @@
   factory _SVGFontFaceFormatElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontFaceFormatElement internalCreate_SVGFontFaceFormatElement() {
     return new _SVGFontFaceFormatElement._internalWrap();
   }
@@ -9081,6 +9211,7 @@
   factory _SVGFontFaceNameElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontFaceNameElement internalCreate_SVGFontFaceNameElement() {
     return new _SVGFontFaceNameElement._internalWrap();
   }
@@ -9114,6 +9245,7 @@
   factory _SVGFontFaceSrcElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontFaceSrcElement internalCreate_SVGFontFaceSrcElement() {
     return new _SVGFontFaceSrcElement._internalWrap();
   }
@@ -9147,6 +9279,7 @@
   factory _SVGFontFaceUriElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGFontFaceUriElement internalCreate_SVGFontFaceUriElement() {
     return new _SVGFontFaceUriElement._internalWrap();
   }
@@ -9184,6 +9317,7 @@
   factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
 
 
+  @Deprecated("Internal Use Only")
   static _SVGGlyphElement internalCreate_SVGGlyphElement() {
     return new _SVGGlyphElement._internalWrap();
   }
@@ -9215,6 +9349,7 @@
   factory _SVGGlyphRefElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGGlyphRefElement internalCreate_SVGGlyphRefElement() {
     return new _SVGGlyphRefElement._internalWrap();
   }
@@ -9255,6 +9390,7 @@
   factory _SVGHKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
 
 
+  @Deprecated("Internal Use Only")
   static _SVGHKernElement internalCreate_SVGHKernElement() {
     return new _SVGHKernElement._internalWrap();
   }
@@ -9289,6 +9425,7 @@
   factory _SVGMPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
 
 
+  @Deprecated("Internal Use Only")
   static _SVGMPathElement internalCreate_SVGMPathElement() {
     return new _SVGMPathElement._internalWrap();
   }
@@ -9325,6 +9462,7 @@
   factory _SVGMissingGlyphElement._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static _SVGMissingGlyphElement internalCreate_SVGMissingGlyphElement() {
     return new _SVGMissingGlyphElement._internalWrap();
   }
@@ -9362,6 +9500,7 @@
   factory _SVGVKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
 
 
+  @Deprecated("Internal Use Only")
   static _SVGVKernElement internalCreate_SVGVKernElement() {
     return new _SVGVKernElement._internalWrap();
   }
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 3f04c44..7be279f 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -19,6 +19,7 @@
 
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_audioBlinkMap = {
   'AnalyserNode': () => AnalyserNode,
   'AudioBuffer': () => AudioBuffer,
@@ -51,6 +52,7 @@
 };
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_audioBlinkFunctionMap = {
   'AnalyserNode': () => AnalyserNode.internalCreateAnalyserNode,
   'AudioBuffer': () => AudioBuffer.internalCreateAudioBuffer,
@@ -97,6 +99,7 @@
   factory AnalyserNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AnalyserNode internalCreateAnalyserNode() {
     return new AnalyserNode._internalWrap();
   }
@@ -177,6 +180,7 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBuffer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AudioBuffer internalCreateAudioBuffer() {
     return new AudioBuffer._internalWrap();
   }
@@ -251,6 +255,7 @@
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
 
+  @Deprecated("Internal Use Only")
   static AudioBufferSourceNode internalCreateAudioBufferSourceNode() {
     return new AudioBufferSourceNode._internalWrap();
   }
@@ -362,6 +367,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static AudioContext internalCreateAudioContext() {
     return new AudioContext._internalWrap();
   }
@@ -527,6 +533,7 @@
   factory AudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AudioDestinationNode internalCreateAudioDestinationNode() {
     return new AudioDestinationNode._internalWrap();
   }
@@ -558,6 +565,7 @@
   // To suppress missing implicit constructor warnings.
   factory AudioListener._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AudioListener internalCreateAudioListener() {
     return new AudioListener._internalWrap();
   }
@@ -613,6 +621,7 @@
   factory AudioNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AudioNode internalCreateAudioNode() {
     return new AudioNode._internalWrap();
   }
@@ -699,6 +708,7 @@
   // To suppress missing implicit constructor warnings.
   factory AudioParam._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AudioParam internalCreateAudioParam() {
     return new AudioParam._internalWrap();
   }
@@ -765,6 +775,7 @@
   factory AudioProcessingEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AudioProcessingEvent internalCreateAudioProcessingEvent() {
     return new AudioProcessingEvent._internalWrap();
   }
@@ -806,6 +817,7 @@
   factory AudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static AudioSourceNode internalCreateAudioSourceNode() {
     return new AudioSourceNode._internalWrap();
   }
@@ -834,6 +846,7 @@
   factory BiquadFilterNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static BiquadFilterNode internalCreateBiquadFilterNode() {
     return new BiquadFilterNode._internalWrap();
   }
@@ -890,6 +903,7 @@
   factory ChannelMergerNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ChannelMergerNode internalCreateChannelMergerNode() {
     return new ChannelMergerNode._internalWrap();
   }
@@ -918,6 +932,7 @@
   factory ChannelSplitterNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ChannelSplitterNode internalCreateChannelSplitterNode() {
     return new ChannelSplitterNode._internalWrap();
   }
@@ -946,6 +961,7 @@
   factory ConvolverNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ConvolverNode internalCreateConvolverNode() {
     return new ConvolverNode._internalWrap();
   }
@@ -990,6 +1006,7 @@
   factory DelayNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DelayNode internalCreateDelayNode() {
     return new DelayNode._internalWrap();
   }
@@ -1022,6 +1039,7 @@
   factory DynamicsCompressorNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static DynamicsCompressorNode internalCreateDynamicsCompressorNode() {
     return new DynamicsCompressorNode._internalWrap();
   }
@@ -1074,6 +1092,7 @@
   factory GainNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static GainNode internalCreateGainNode() {
     return new GainNode._internalWrap();
   }
@@ -1106,6 +1125,7 @@
   factory MediaElementAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaElementAudioSourceNode internalCreateMediaElementAudioSourceNode() {
     return new MediaElementAudioSourceNode._internalWrap();
   }
@@ -1139,6 +1159,7 @@
   factory MediaStreamAudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaStreamAudioDestinationNode internalCreateMediaStreamAudioDestinationNode() {
     return new MediaStreamAudioDestinationNode._internalWrap();
   }
@@ -1171,6 +1192,7 @@
   factory MediaStreamAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static MediaStreamAudioSourceNode internalCreateMediaStreamAudioSourceNode() {
     return new MediaStreamAudioSourceNode._internalWrap();
   }
@@ -1203,6 +1225,7 @@
   factory OfflineAudioCompletionEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static OfflineAudioCompletionEvent internalCreateOfflineAudioCompletionEvent() {
     return new OfflineAudioCompletionEvent._internalWrap();
   }
@@ -1241,6 +1264,7 @@
   }
 
 
+  @Deprecated("Internal Use Only")
   static OfflineAudioContext internalCreateOfflineAudioContext() {
     return new OfflineAudioContext._internalWrap();
   }
@@ -1280,6 +1304,7 @@
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
 
+  @Deprecated("Internal Use Only")
   static OscillatorNode internalCreateOscillatorNode() {
     return new OscillatorNode._internalWrap();
   }
@@ -1361,6 +1386,7 @@
   factory PannerNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static PannerNode internalCreatePannerNode() {
     return new PannerNode._internalWrap();
   }
@@ -1463,6 +1489,7 @@
   // To suppress missing implicit constructor warnings.
   factory PeriodicWave._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static PeriodicWave internalCreatePeriodicWave() {
     return new PeriodicWave._internalWrap();
   }
@@ -1504,6 +1531,7 @@
   static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent = const EventStreamProvider<AudioProcessingEvent>('audioprocess');
 
 
+  @Deprecated("Internal Use Only")
   static ScriptProcessorNode internalCreateScriptProcessorNode() {
     return new ScriptProcessorNode._internalWrap();
   }
@@ -1554,6 +1582,7 @@
   factory WaveShaperNode._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static WaveShaperNode internalCreateWaveShaperNode() {
     return new WaveShaperNode._internalWrap();
   }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 1805e18..3d6ed95 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -20,6 +20,7 @@
 
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_glBlinkMap = {
   'ANGLEInstancedArrays': () => AngleInstancedArrays,
   'EXTBlendMinMax': () => ExtBlendMinMax,
@@ -60,6 +61,7 @@
 };
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_glBlinkFunctionMap = {
   'ANGLEInstancedArrays': () => AngleInstancedArrays.internalCreateAngleInstancedArrays,
   'EXTBlendMinMax': () => ExtBlendMinMax.internalCreateExtBlendMinMax,
@@ -412,6 +414,7 @@
   // To suppress missing implicit constructor warnings.
   factory ActiveInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ActiveInfo internalCreateActiveInfo() {
     return new ActiveInfo._internalWrap();
   }
@@ -452,6 +455,7 @@
   // To suppress missing implicit constructor warnings.
   factory AngleInstancedArrays._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static AngleInstancedArrays internalCreateAngleInstancedArrays() {
     return new AngleInstancedArrays._internalWrap();
   }
@@ -500,6 +504,7 @@
   // To suppress missing implicit constructor warnings.
   factory Buffer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Buffer internalCreateBuffer() {
     return new Buffer._internalWrap();
   }
@@ -529,6 +534,7 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureAtc._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CompressedTextureAtc internalCreateCompressedTextureAtc() {
     return new CompressedTextureAtc._internalWrap();
   }
@@ -569,6 +575,7 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CompressedTextureETC1 internalCreateCompressedTextureETC1() {
     return new CompressedTextureETC1._internalWrap();
   }
@@ -603,6 +610,7 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTexturePvrtc._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CompressedTexturePvrtc internalCreateCompressedTexturePvrtc() {
     return new CompressedTexturePvrtc._internalWrap();
   }
@@ -648,6 +656,7 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureS3TC._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static CompressedTextureS3TC internalCreateCompressedTextureS3TC() {
     return new CompressedTextureS3TC._internalWrap();
   }
@@ -714,6 +723,7 @@
   // To suppress missing implicit constructor warnings.
   factory ContextAttributes._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ContextAttributes internalCreateContextAttributes() {
     return new ContextAttributes._internalWrap();
   }
@@ -801,6 +811,7 @@
   factory ContextEvent._() { throw new UnsupportedError("Not supported"); }
 
 
+  @Deprecated("Internal Use Only")
   static ContextEvent internalCreateContextEvent() {
     return new ContextEvent._internalWrap();
   }
@@ -832,6 +843,7 @@
   // To suppress missing implicit constructor warnings.
   factory DebugRendererInfo._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DebugRendererInfo internalCreateDebugRendererInfo() {
     return new DebugRendererInfo._internalWrap();
   }
@@ -869,6 +881,7 @@
   // To suppress missing implicit constructor warnings.
   factory DebugShaders._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DebugShaders internalCreateDebugShaders() {
     return new DebugShaders._internalWrap();
   }
@@ -902,6 +915,7 @@
   // To suppress missing implicit constructor warnings.
   factory DepthTexture._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DepthTexture internalCreateDepthTexture() {
     return new DepthTexture._internalWrap();
   }
@@ -935,6 +949,7 @@
   // To suppress missing implicit constructor warnings.
   factory DrawBuffers._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DrawBuffers internalCreateDrawBuffers() {
     return new DrawBuffers._internalWrap();
   }
@@ -1103,6 +1118,7 @@
   // To suppress missing implicit constructor warnings.
   factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ExtBlendMinMax internalCreateExtBlendMinMax() {
     return new ExtBlendMinMax._internalWrap();
   }
@@ -1142,6 +1158,7 @@
   // To suppress missing implicit constructor warnings.
   factory ExtFragDepth._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ExtFragDepth internalCreateExtFragDepth() {
     return new ExtFragDepth._internalWrap();
   }
@@ -1170,6 +1187,7 @@
   // To suppress missing implicit constructor warnings.
   factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ExtShaderTextureLod internalCreateExtShaderTextureLod() {
     return new ExtShaderTextureLod._internalWrap();
   }
@@ -1199,6 +1217,7 @@
   // To suppress missing implicit constructor warnings.
   factory ExtTextureFilterAnisotropic._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ExtTextureFilterAnisotropic internalCreateExtTextureFilterAnisotropic() {
     return new ExtTextureFilterAnisotropic._internalWrap();
   }
@@ -1235,6 +1254,7 @@
   // To suppress missing implicit constructor warnings.
   factory Framebuffer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Framebuffer internalCreateFramebuffer() {
     return new Framebuffer._internalWrap();
   }
@@ -1264,6 +1284,7 @@
   // To suppress missing implicit constructor warnings.
   factory LoseContext._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static LoseContext internalCreateLoseContext() {
     return new LoseContext._internalWrap();
   }
@@ -1301,6 +1322,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesElementIndexUint._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesElementIndexUint internalCreateOesElementIndexUint() {
     return new OesElementIndexUint._internalWrap();
   }
@@ -1330,6 +1352,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesStandardDerivatives._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesStandardDerivatives internalCreateOesStandardDerivatives() {
     return new OesStandardDerivatives._internalWrap();
   }
@@ -1363,6 +1386,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloat._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesTextureFloat internalCreateOesTextureFloat() {
     return new OesTextureFloat._internalWrap();
   }
@@ -1392,6 +1416,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesTextureFloatLinear internalCreateOesTextureFloatLinear() {
     return new OesTextureFloatLinear._internalWrap();
   }
@@ -1421,6 +1446,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloat._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesTextureHalfFloat internalCreateOesTextureHalfFloat() {
     return new OesTextureHalfFloat._internalWrap();
   }
@@ -1454,6 +1480,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesTextureHalfFloatLinear internalCreateOesTextureHalfFloatLinear() {
     return new OesTextureHalfFloatLinear._internalWrap();
   }
@@ -1483,6 +1510,7 @@
   // To suppress missing implicit constructor warnings.
   factory OesVertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static OesVertexArrayObject internalCreateOesVertexArrayObject() {
     return new OesVertexArrayObject._internalWrap();
   }
@@ -1531,6 +1559,7 @@
   // To suppress missing implicit constructor warnings.
   factory Program._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Program internalCreateProgram() {
     return new Program._internalWrap();
   }
@@ -1559,6 +1588,7 @@
   // To suppress missing implicit constructor warnings.
   factory Renderbuffer._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Renderbuffer internalCreateRenderbuffer() {
     return new Renderbuffer._internalWrap();
   }
@@ -1587,6 +1617,7 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static RenderingContext internalCreateRenderingContext() {
     return new RenderingContext._internalWrap();
   }
@@ -3532,6 +3563,7 @@
   // To suppress missing implicit constructor warnings.
   factory Shader._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Shader internalCreateShader() {
     return new Shader._internalWrap();
   }
@@ -3559,6 +3591,7 @@
   // To suppress missing implicit constructor warnings.
   factory ShaderPrecisionFormat._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static ShaderPrecisionFormat internalCreateShaderPrecisionFormat() {
     return new ShaderPrecisionFormat._internalWrap();
   }
@@ -3598,6 +3631,7 @@
   // To suppress missing implicit constructor warnings.
   factory Texture._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static Texture internalCreateTexture() {
     return new Texture._internalWrap();
   }
@@ -3625,6 +3659,7 @@
   // To suppress missing implicit constructor warnings.
   factory UniformLocation._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static UniformLocation internalCreateUniformLocation() {
     return new UniformLocation._internalWrap();
   }
@@ -3654,6 +3689,7 @@
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static VertexArrayObject internalCreateVertexArrayObject() {
     return new VertexArrayObject._internalWrap();
   }
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 13c0124..3b7d758 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -27,6 +27,7 @@
 
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_sqlBlinkMap = {
   'Database': () => SqlDatabase,
   'SQLError': () => SqlError,
@@ -37,6 +38,7 @@
 };
 
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_sqlBlinkFunctionMap = {
   'Database': () => SqlDatabase.internalCreateSqlDatabase,
   'SQLError': () => SqlError.internalCreateSqlError,
@@ -107,6 +109,7 @@
   // To suppress missing implicit constructor warnings.
   factory SqlDatabase._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SqlDatabase internalCreateSqlDatabase() {
     return new SqlDatabase._internalWrap();
   }
@@ -186,6 +189,7 @@
   // To suppress missing implicit constructor warnings.
   factory SqlError._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SqlError internalCreateSqlError() {
     return new SqlError._internalWrap();
   }
@@ -255,6 +259,7 @@
   // To suppress missing implicit constructor warnings.
   factory SqlResultSet._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SqlResultSet internalCreateSqlResultSet() {
     return new SqlResultSet._internalWrap();
   }
@@ -296,6 +301,7 @@
   // To suppress missing implicit constructor warnings.
   factory SqlResultSetRowList._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SqlResultSetRowList internalCreateSqlResultSetRowList() {
     return new SqlResultSetRowList._internalWrap();
   }
@@ -382,6 +388,7 @@
   // To suppress missing implicit constructor warnings.
   factory SqlTransaction._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static SqlTransaction internalCreateSqlTransaction() {
     return new SqlTransaction._internalWrap();
   }
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index ac59077..aa341d6 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -12,6 +12,10 @@
 # TBF: Static members should not be accessible via subclasses.
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t05: MissingStaticWarning
 
+# TBF: noSuchMethod can now be inherited
+Language/07_Classes/4_Abstract_Instance_Members_A02_t03: fail, OK
+Language/07_Classes/4_Abstract_Instance_Members_A02_t04: fail, OK
+
 # co19 issue #442, undefined name "Expect"
 Language/15_Types/4_Interface_Types_A08_t03: fail, OK
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index e42ce660..a51dda3 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -177,11 +177,6 @@
 factory_redirection_test/14: StaticWarning # Issue 18230
 factory_redirection_test/none: StaticWarning # Issue 18230
 
-# analyzer does not handle @proxy and noSuchMethod correctly
-override_inheritance_no_such_method_test/03: StaticWarning # Issue 16132
-override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
-override_inheritance_no_such_method_test/05: StaticWarning # Issue 16132
-
 # The following tests are currently assumed to be failing because the test is wrong.
 #
 application_negative_test: CompileTimeError # Test Issue 14528
diff --git a/tests/language/override_inheritance_no_such_method_test.dart b/tests/language/override_inheritance_no_such_method_test.dart
index 45be62e..80409e0 100644
--- a/tests/language/override_inheritance_no_such_method_test.dart
+++ b/tests/language/override_inheritance_no_such_method_test.dart
@@ -43,7 +43,7 @@
 class B {
   method12(); /// 12: continued
 
-  noSuchMethod(_) => null; /// 13: static type warning
+  noSuchMethod(_) => null; /// 13: ok
   method13(); /// 13: continued
 }
 
diff --git a/tests/lib/convert/base64_test.dart b/tests/lib/convert/base64_test.dart
index 016dc91..ccbed3d 100644
--- a/tests/lib/convert/base64_test.dart
+++ b/tests/lib/convert/base64_test.dart
@@ -20,12 +20,20 @@
     testRoundtrip(new Uint8List.fromList(list), "Uint8List#${list.length}");
   }
   testErrors();
+
+  // Decoder is lenienet with mixed styles.
+  Expect.listEquals([0xfb, 0xff, 0xbf, 0x00], BASE64.decode("-_+/AA%3D="));
+  Expect.listEquals([0xfb, 0xff, 0xbf, 0x00], BASE64.decode("-_+/AA=%3D"));
 }
 
 void testRoundtrip(list, name) {
   // Direct.
-  String encoded = BASE64.encode(list);
-  List result = BASE64.decode(encoded);
+  String encodedNormal = BASE64.encode(list);
+  String encodedPercent = encodedNormal.replaceAll("=", "%3D");
+  String uriEncoded = encodedNormal.replaceAll("+", "-").replaceAll("/", "_");
+  List result = BASE64.decode(encodedNormal);
+  Expect.listEquals(list, result, name);
+  result = BASE64.decode(encodedPercent);
   Expect.listEquals(list, result, name);
 
   int increment = list.length ~/ 7 + 1;
@@ -42,7 +50,7 @@
         encoder.add(list.sublist(j, list.length));
         encoder.close();
         var name = "0-$i-$j-${list.length}: list";
-        Expect.equals(encoded, results.join(""), name);
+        Expect.equals(encodedNormal, results.join(""), name);
       }
       {
         // Using addSlice
@@ -53,36 +61,40 @@
         encoder.addSlice(list, i, j, false);
         encoder.addSlice(list, j, list.length, true);
         var name = "0-$i-$j-${list.length}: $list";
-        Expect.equals(encoded, results.join(""), name);
+        Expect.equals(encodedNormal, results.join(""), name);
       }
     }
   }
 
-  increment = encoded.length ~/ 7 + 1;
-  for (int i = 0; i < encoded.length; i += increment) {
-    for (int j = i; j < encoded.length; j += increment) {
-      {
-        // Using add/close
-        var results;
-        var sink = new ChunkedConversionSink.withCallback((v) { results = v; });
-        var decoder = BASE64.decoder.startChunkedConversion(sink);
-        decoder.add(encoded.substring(0, i));
-        decoder.add(encoded.substring(i, j));
-        decoder.add(encoded.substring(j, encoded.length));
-        decoder.close();
-        var name = "0-$i-$j-${encoded.length}: $encoded";
-        Expect.listEquals(list, results.expand((x)=>x).toList(), name);
-      }
-      {
-        // Using addSlice
-        var results;
-        var sink = new ChunkedConversionSink.withCallback((v) { results = v; });
-        var decoder = BASE64.decoder.startChunkedConversion(sink);
-        decoder.addSlice(encoded, 0, i, false);
-        decoder.addSlice(encoded, i, j, false);
-        decoder.addSlice(encoded, j, encoded.length, true);
-        var name = "0-$i-$j-${encoded.length}: $encoded";
-        Expect.listEquals(list, results.expand((x)=>x).toList(), name);
+  for (var encoded in [encodedNormal, encodedPercent, uriEncoded]) {
+    increment = encoded.length ~/ 7 + 1;
+    for (int i = 0; i < encoded.length; i += increment) {
+      for (int j = i; j < encoded.length; j += increment) {
+        {
+          // Using add/close
+          var results;
+          var sink =
+              new ChunkedConversionSink.withCallback((v) { results = v; });
+          var decoder = BASE64.decoder.startChunkedConversion(sink);
+          decoder.add(encoded.substring(0, i));
+          decoder.add(encoded.substring(i, j));
+          decoder.add(encoded.substring(j, encoded.length));
+          decoder.close();
+          var name = "0-$i-$j-${encoded.length}: $encoded";
+          Expect.listEquals(list, results.expand((x)=>x).toList(), name);
+        }
+        {
+          // Using addSlice
+          var results;
+          var sink =
+              new ChunkedConversionSink.withCallback((v) { results = v; });
+          var decoder = BASE64.decoder.startChunkedConversion(sink);
+          decoder.addSlice(encoded, 0, i, false);
+          decoder.addSlice(encoded, i, j, false);
+          decoder.addSlice(encoded, j, encoded.length, true);
+          var name = "0-$i-$j-${encoded.length}: $encoded";
+          Expect.listEquals(list, results.expand((x)=>x).toList(), name);
+        }
       }
     }
   }
@@ -123,6 +135,11 @@
   badDecode("AAAA==");
   badDecode("AAAA===");
   badDecode("AAAA====");
+  badDecode("AAAA%");
+  badDecode("AAAA%3");
+  badDecode("AAAA%3D");
+  badDecode("AAA%3D%");
+  badDecode("AAA%3D=");
   badDecode("A=");
   badDecode("A=A");
   badDecode("A==");
@@ -130,11 +147,12 @@
   badDecode("A===");
   badDecode("====");
   badDecode("AA=");
+  badDecode("AA%=");
+  badDecode("AA%3");
+  badDecode("AA%3D");
   badDecode("AA===");
   badDecode("AAA==");
   badDecode("AAA=AAAA");
-  badDecode("AAA-");
-  badDecode("AAA_");
   badDecode("AAA\x00");
   badDecode("AAA=\x00");
   badDecode("AAA\x80");
@@ -142,9 +160,12 @@
   badDecode("AAA\u{141}");
   badDecode("AAA\u{1041}");
   badDecode("AAA\u{10041}");
+  badDecode("AA\u{141}=");
+  badDecode("AA\u{1041}=");
+  badDecode("AA\u{10041}=");
 
   var alphabet =
-    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
+    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/-_";
   var units = alphabet.codeUnits;
   for (int i = 0; i < 128; i++) {
     if (!units.contains(i)) {
diff --git a/tools/VERSION b/tools/VERSION
index 67945602..0503714 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 13
 PATCH 0
 PRERELEASE 7
-PRERELEASE_PATCH 3
+PRERELEASE_PATCH 4
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 226eed1..75308d4 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -609,6 +609,7 @@
 
     js_interop_wrapper = '''
 
+  @Deprecated("Internal Use Only")
   static {0} internalCreate{0}() {{
     return new {0}._internalWrap();
   }}
@@ -622,6 +623,7 @@
 '''.format(class_name)
     if base_class == 'NativeFieldWrapperClass2' or base_class == 'DartHtmlDomObject':
         js_interop_wrapper = '''
+  @Deprecated("Internal Use Only")
   static {0} internalCreate{0}() {{
     return new {0}._internalWrap();
   }}
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 4dc5fc9..850b539 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -151,6 +151,7 @@
   return _Utils.spawnDomUri(uri.toString());
 }
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final htmlBlinkMap = {
   '_HistoryCrossFrame': () => _HistoryCrossFrame,
   '_LocationCrossFrame': () => _LocationCrossFrame,
@@ -259,6 +260,7 @@
 
 // TODO(terry): We may want to move this elsewhere if html becomes
 // a package to avoid dartium depending on pkg:html.
+@Deprecated("Internal Use Only")
 getHtmlCreateFunction(String key) {
   var result;
 
@@ -391,9 +393,13 @@
 
 /// An abstract class for all DOM objects we wrap in dart:html and related
 ///  libraries.
+///
+/// ** Internal Use Only **
+@Deprecated("Internal Use Only")
 class DartHtmlDomObject {
 
   /// The underlying JS DOM object.
+  @Deprecated("Internal Use Only")
   js.JsObject blink_jsObject;
 
 }
@@ -424,11 +430,13 @@
   return dartInstance;
 }
 
+@Deprecated("Internal Use Only")
 class DebugAssertException implements Exception {
   String message;
   DebugAssertException(this.message);
 }
 
+@Deprecated("Internal Use Only")
 debug_or_assert(message, expression) {
   if (!expression) {
     throw new DebugAssertException("$message");
@@ -441,6 +449,7 @@
 //              user's this (this is needed for futures) and listener function.
 Map<int, Map<int, js.JsFunction>> _knownListeners = {};
 
+@Deprecated("Internal Use Only")
 js.JsFunction wrap_event_listener(theObject, Function listener) {
   var thisHashCode = theObject.hashCode;
   var listenerHashCode = identityHashCode(listener);
@@ -452,6 +461,7 @@
   return _knownListeners[thisHashCode][listenerHashCode];
 }
 
+@Deprecated("Internal Use Only")
 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
   var result = new Map();
   var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), 'keys', [jsObject]);
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 9804405..ef3928c 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -107,12 +107,14 @@
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final indexed_dbBlinkMap = {
 $!TYPE_MAP
 };
 
 $if JSINTEROP
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final indexed_dbBlinkFunctionMap = {
 $!TYPE_FUNCTION_MAP
 };
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index 0a34b64..ab2a99d 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -24,12 +24,14 @@
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final svgBlinkMap = {
 $!TYPE_MAP
 };
 
 $if JSINTEROP
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final svgBlinkFunctionMap = {
 $!TYPE_FUNCTION_MAP
 };
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index 15204d6..43b42c9 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -18,12 +18,14 @@
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_audioBlinkMap = {
 $!TYPE_MAP
 };
 
 $if JSINTEROP
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_audioBlinkFunctionMap = {
 $!TYPE_FUNCTION_MAP
 };
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index 56eee6e..7cc4289 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -20,12 +20,14 @@
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_glBlinkMap = {
 $!TYPE_MAP
 };
 
 $if JSINTEROP
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_glBlinkFunctionMap = {
 $!TYPE_FUNCTION_MAP
 };
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 2a5d04a..21ef127 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -26,12 +26,14 @@
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_sqlBlinkMap = {
 $!TYPE_MAP
 };
 
 $if JSINTEROP
 // FIXME: Can we make this private?
+@Deprecated("Internal Use Only")
 final web_sqlBlinkFunctionMap = {
 $!TYPE_FUNCTION_MAP
 };
diff --git a/tools/dom/templates/html/impl/impl_DOMException.darttemplate b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
index 809b2e5..bf5f0b6 100644
--- a/tools/dom/templates/html/impl/impl_DOMException.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
@@ -47,6 +47,7 @@
   // To suppress missing implicit constructor warnings.
   factory DomException._() { throw new UnsupportedError("Not supported"); }
 
+  @Deprecated("Internal Use Only")
   static DomException internalCreateDomException() {
     return new DomException._internalWrap();
   }
