Version 1.13.0-dev.7.4

Cherry-pick 395f25502315b65ba1f9d4f5e7cd2764706ca82b to dev
Cherry-pick 8831fb876ea5989f48a3e95858cf83093b374e96 to dev
Cherry-pick 1ea666f401bf384de8f4a27793e0e680f9fbc3ca to dev
Cherry-pick 888c4c526f5a942d3168bc58573f364efa82fa97 to dev
Cherry-pick 5ec298794bf70d1855d74321d63c635007d92578 to dev
Cherry-pick cae05d6bd43d8f2cf616b6d93317c28a99778190 to dev
Cherry-pick 3188a749946e62f335914691b5a7198662b3648a to dev
Cherry-pick 9989687a2599c566d376967753992ef5e5481927 to dev
Cherry-pick 0cd0c886a102f7a17f23ff372c51bc65beb86ced to dev
Cherry-pick 395b82c041466763e9b738000586e91f389edc99 to dev
Cherry-pick e3970349ba95c242e563df0d0fe0b285bc234d7e to dev
Cherry-pick 91e5facc0f1738bae94a9f4b3f7958d47de7ac92 to dev
Cherry-pick 40b38e988bf46f9c17ef35ba326e0d92e30f843d to dev
Cherry-pick 18a29ba8a86ff7bfd2f712d44285acd2cfaa48e2 to dev
Cherry-pick ce6614f2dc418385919fed4d74a07be74b1fe40b to dev
Cherry-pick 381d3ac5497f3d127bffcf3cdb5a6189652f7df7 to dev
Cherry-pick 3825cf0cd45f367de7f4cde35acd124b0a256725 to dev
Cherry-pick adb8ebd0e67d10fadb4e2cc9ba55c1347e80cfa4 to dev
Cherry-pick 67576340b0d9a3670707851648584258f1ead7a4 to dev
Cherry-pick 204ee60bd0019cbca821677457ac91c7547e282b to dev
Cherry-pick 873d46cbbb9ab13f47a0e51cad1da35b7cc03066 to dev
Cherry-pick b49a389fbf0fff063d4de38f44c2406c29dd8667 to dev
Cherry-pick c0d68a5437e9a35aed549e2c4021bcd5b4abef0d to dev
Cherry-pick af4fbdd9528a6411ea1f1c29f3beccdc0ae093b7 to dev
Cherry-pick 3b198ed6ae1af640759da49f115fce3739e82712 to dev
Cherry-pick 2d3fe73b363b3757db494a3458bd08c0f63f5f80 to dev
Cherry-pick 3a6234692593dc08c42d9c596b285b3b90022e98 to dev
Cherry-pick 8eb408914d1410a79af066e43c959fd6e6b51b05 to dev
Cherry-pick 27eb09033f880d9832380d37751b193f50a53127 to dev
Cherry-pick 948b21a8cff96a1a8cec414121983c8923eb2c21 to dev
Cherry-pick c5f4af4df6c252f55fb2c08897e5d795c4ee92a7 to dev
Cherry-pick 6da5bb4ee44bafae746f0bdd118030c1b96e79fb to dev
Cherry-pick 140a4f5891a4e7fbd716e6e3100dd68ed03c5e97 to dev
Cherry-pick 365ea71f7801e38f36115b9955b78f61ee90c018 to dev
Cherry-pick e0636b183c4ab2a87b2d93198105c1413e3ea4d8 to dev
Cherry-pick 78c7cde13207a5c8df688c637d60c7cf563545ab to dev
Cherry-pick 186bbfc92928a5324aa4f60488277730bdcd3731 to dev
Cherry-pick 568484d1062fc11afdd3b37d94350e0356a27c10 to dev
Cherry-pick 4249335a0e8672ebd1593df9e85c45b798c54705 to dev
Cherry-pick ea947094aea148d26bcb76527087f17f99866239 to dev
Cherry-pick d5830fb6a3bc37de8ce230fcd3e6ffd6798a8435 to dev
Cherry-pick 5e9ea82aa44b75b1084c6e8f45ae5a5e952ad368 to dev
Cherry-pick 5f71b2e7cd3137fe4e8b7b58bb04b8c1f32129bf to dev
Cherry-pick f145f89ccb4b807641914a0631e9c77995a29b20 to dev
Cherry-pick f8092a10124e0b0a9bbfb7b4da38b5aea58ac727 to dev
Cherry-pick 2a88bdac4adcc50a40d8f0724827b4bbfe949695 to dev
Cherry-pick 5b48108e07ab669ba6aaab31f45852a0f5f4ca91 to dev
Cherry-pick c7907e780079a475b087f6bc614fd0967d3ea4a7 to dev
Cherry-pick fc1f07fe2ee04640917751607ceaea6b031d9a1d to dev
Cherry-pick cc8f64b824ac0bd7607ffd330f0b4c287ee25e0f to dev
Cherry-pick 527c163becbfe34b8c545f60cb67efb6ff30ab3e to dev
Cherry-pick de54dcbb0a442ade22d9d0a59b649a7653e7ec2b to dev
Cherry-pick bf0ba96027339f70dce4f1c4d34cb16651b5222d to dev
Cherry-pick ba6078197ba8093706873569d123cd94aa897308 to dev
Cherry-pick 6c85fe785a85b1a907ce05f440dd08b2fd0fd994 to dev
Cherry-pick 417161413f62fc73444327facd42311963b0f37a to dev
Cherry-pick ff40c262cf934d6e5068c1e2ca8d547956c94877 to dev
Cherry-pick 63865b5d1bda3861f4fd65edec38d99e44dd6ce4 to dev
Cherry-pick f18a0209fb118d13a05cda315c91cefb04c0282a to dev
Cherry-pick 7995c8ef1e8b3f9a5b18b42f553b77ab64ae7f6d to dev
Cherry-pick fb8cc0aa39e911cb0119a434ba6ea9e6e9ad76af to dev
Cherry-pick afa746230fc22a8274bd7fa496aa63e0c7ddbc03 to dev
Cherry-pick 9efcce02c314efd82dcc57a2a6a5a9592cec88d1 to dev
Cherry-pick 6726ac5ccd06239977c7a2aa06a4d3e3e34dd9ba to dev
Cherry-pick 0881b53a3bf73e1b7671ea337f05d2dcf9aba80b to dev
Cherry-pick f45c8bc91785195f6c440f2045bbafda173b763a to dev
Cherry-pick b1215d77183e4e8306151177ca6ecbc550666f94 to dev
Cherry-pick fe4644e35bdc9343066c00d3399b2f82ab380528 to dev
Cherry-pick 763af3d14e77157438797fdeed6eecb1d827b352 to dev
Cherry-pick f09778528afedc456112fdf1b032431f0d5f6e93 to dev
Cherry-pick af8c1938dcc80e7192207b9b143f70e197075498 to dev
Cherry-pick a4a3053afd866841e360211318c5888869a28f3f to dev
Cherry-pick 07acac8b8e87d66e5e89fb7a94596428c98ca212 to dev
Cherry-pick d12abed5d72ae6676eda757fb0475c48d55b7a8b to dev
Cherry-pick 5bd191ee12674f0fb60cc887be4c97bdd6a9ca79 to dev
Cherry-pick 33e6b737e8ecff2f4d913a0624e51b90d6692b84 to dev
Cherry-pick 041e61a0f63467612635a3cead6e999f7ca7b485 to dev
Cherry-pick c133bf9467a2b469c24bf77e6187d727b4ef2595 to dev
Cherry-pick df580cf0ea94121eee70daa303e73520cae0677e to dev
Cherry-pick 4653d9bb76e8be1aeaf6db6f0fcdb9c8cd9d5d47 to dev
Cherry-pick c43f292dd9f4bbb708756d0e1b56bdfac2f6ecdc to dev
Cherry-pick 396ed51cf04cfdfd3f33e6803a32e6a9cbfeefcf to dev
Cherry-pick 2d8d0e1ed79c4ddd38b6ea7ea07373dc88fcfe57 to dev
Cherry-pick 289bd0a056abb17587a692fd9b1f5f02190139e5 to dev
Cherry-pick bb431bbec438320105da4c1876f260aa4fea161e to dev
Cherry-pick 6e7c45403700f8ccd1a99d71f08cd7fdafd41c93 to dev
Cherry-pick 68dc36a3e73c5303828c0cec9b469e2038bf7a14 to dev
Cherry-pick 15c9636924bf128057a305187c920d9b3cb102ef to dev
Cherry-pick ffccd9af762ac566051acb7fa45f446e0ae06af5 to dev
Cherry-pick b32e2ce0db74f052e2aa1e548e78e7f3d2532737 to dev
Cherry-pick cbea0dedf98c449178455eb17089d7a1b6a16985 to dev
Cherry-pick 52fb3b3babd3595539ca4872475948c462e9a6d1 to dev
Cherry-pick 808f32d61d1188451a54feac6173054814dbbd22 to dev
Cherry-pick e2f905e11d731a2d3b808cd0a824b447cef227e7 to dev
Cherry-pick cee3f13ae0a945acba9ef4250ca6be0456b28033 to dev
Cherry-pick 289a22182e629e7e4f9085e3807ca0256dad5769 to dev
Cherry-pick a1226dfcf713cbc68fc6cff9bab355f6f19f32c5 to dev
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();
   }