Version 1.11.0-dev.0.0

svn merge -r 45051:45518 https://dart.googlecode.com/svn/branches/bleeding_edge trunk


git-svn-id: https://dart.googlecode.com/svn/trunk@45519 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/dart/CHANGELOG.md b/dart/CHANGELOG.md
index c4321b3..d236bf7 100644
--- a/dart/CHANGELOG.md
+++ b/dart/CHANGELOG.md
@@ -1,4 +1,83 @@
-## 1.9.1 (2015-03-25)
+## 1.11.0
+
+### Core library changes
+
+* `dart:core`
+  * Add `unmodifiable` constructor to `List` -
+    [r45334](https://code.google.com/p/dart/source/detail?r=45334)
+* `dart:isolate` *Experimental*
+  * Make the `priority` parameter of `Isolate.ping` and `Isolate.kill` methods
+    a named parameter.
+  * Remove the `Isolate.AS_EVENT` priority.
+  * Add extra `response` parameter to `Isolate.ping` and
+    `Isolate.addOnExitListener` -
+    [r45092](https://code.google.com/p/dart/source/detail?r=45092)
+
+## 1.10.0 – 2015-04-29
+
+### Core library changes
+
+* `dart:convert`
+  * **POTENTIALLY BREAKING** Fix behavior of `HtmlEscape`. It no longer escapes
+  no-break space (U+00A0) anywhere or forward slash (`/`, `U+002F`) in element
+  context. Slash is still escaped using `HtmlEscapeMode.UNKNOWN`.
+  [r45003](https://code.google.com/p/dart/source/detail?r=45003),
+  [r45153](https://code.google.com/p/dart/source/detail?r=45153),
+  [r45189](https://code.google.com/p/dart/source/detail?r=45189)
+
+* `dart:core`
+  * `Uri.parse` added `start` and `end` positional arguments.
+
+* `dart:html`
+  * **POTENTIALLY BREAKING** `CssClassSet` method arguments must now be 'tokens', i.e. non-empty
+  strings with no white-space characters. The implementation was incorrect for
+  class names containing spaces. The fix is to forbid spaces and provide a
+  faster implementation.
+  [Announcement](https://groups.google.com/a/dartlang.org/d/msg/announce/jmUI2XJHfC8/UZUCvJH3p2oJ)
+
+* `dart:io`
+
+  * `ProcessResult` now exposes a constructor.
+  * `import` and `Isolate.spawnUri` now supports the
+    [Data URI scheme](http://en.wikipedia.org/wiki/Data_URI_scheme) on the VM.
+
+## Tool Changes
+
+### pub
+
+  * Running `pub run foo` within a package now runs the `foo` executable defined
+    by the `foo` package. The previous behavior ran `bin/foo`. This makes it
+    easy to run binaries in dependencies, for instance `pub run test`.
+
+  * On Mac and Linux, signals sent to `pub run` and forwarded to the child
+    command.
+
+## 1.9.3 – 2015-04-14
+
+This is a bug fix release which merges a number of commits from `bleeding_edge`.
+
+* dart2js: Addresses as issue with minified Javascript output with CSP enabled -
+  [r44453](https://code.google.com/p/dart/source/detail?r=44453)
+
+* Editor: Fixes accidental updating of files in the pub cache during rename
+  refactoring - [r44677](https://code.google.com/p/dart/source/detail?r=44677)
+
+* Editor: Fix for
+  [issue 23032](https://code.google.com/p/dart/issues/detail?id=23032)
+  regarding skipped breakpoints on Windows -
+  [r44824](https://code.google.com/p/dart/source/detail?r=44824)
+
+* dart:mirrors: Fix `MethodMirror.source` when the method is on the first line
+  in a script -
+  [r44957](https://code.google.com/p/dart/source/detail?r=44957),
+  [r44976](https://code.google.com/p/dart/source/detail?r=44976)
+
+* pub: Fix for
+  [issue 23084](https://code.google.com/p/dart/issues/detail?id=23084):
+  Pub can fail to load transformers necessary for local development -
+  [r44876](https://code.google.com/p/dart/source/detail?r=44876)
+
+## 1.9.1 – 2015-03-25
 
 ### Language changes
 
@@ -78,7 +157,7 @@
 
   * `HttpServer.bind` and `HttpServer.bindSecure` added the `v6Only` named
     argument. If this is true, only IPv6 connections will be accepted.
-    
+
   * `HttpServer.bind`, `HttpServer.bindSecure`, `ServerSocket.bind`,
     `RawServerSocket.bind`, `SecureServerSocket.bind` and
     `RawSecureServerSocket.bind` added the `shared` named argument. If this is
@@ -112,7 +191,7 @@
   * Isolates spawned via `Isolate.spawn` now allow most objects, including
     top-level and static functions, to be sent between them.
 
-## 1.8.5 (2015-01-21)
+## 1.8.5 – 2015-01-21
 
 * Code generation for SIMD on ARM and ARM64 is fixed.
 
@@ -122,7 +201,7 @@
 
 [issue 21795]: https://code.google.com/p/dart/issues/detail?id=21795
 
-## 1.8.3 (2014-12-10)
+## 1.8.3 – 2014-12-10
 
 * Breakpoints can be set in the Editor using file suffixes ([issue 21280][]).
 
@@ -139,7 +218,7 @@
 [issue 21280]: https://code.google.com/p/dart/issues/detail?id=21280
 [issue 21698]: https://code.google.com/p/dart/issues/detail?id=21698
 
-## 1.8.0 (2014-11-28)
+## 1.8.0 – 2014-11-28
 
 * `dart:collection`: `SplayTree` added the `toSet` function.
 
@@ -180,7 +259,7 @@
 
 [alpn]: https://tools.ietf.org/html/rfc7301
 
-## 1.7.0 (2014-10-15)
+## 1.7.0 – 2014-10-15
 
 ### Tool changes
 
diff --git a/dart/editor/tools/plugins/com.google.dart.eclipse.ui/plugin.xml b/dart/editor/tools/plugins/com.google.dart.eclipse.ui/plugin.xml
index 2aa6b50..7cecfaf 100644
--- a/dart/editor/tools/plugins/com.google.dart.eclipse.ui/plugin.xml
+++ b/dart/editor/tools/plugins/com.google.dart.eclipse.ui/plugin.xml
@@ -339,20 +339,20 @@
           locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.generate">
        <menu
              label="Dart">
-          <visibleWhen>
-          <and>
-          <test
-                     property="com.google.dart.tools.debug.isInDartProject"
-                     value="true">
-               </test>
-            <with variable="activeMenuSelection">
+          <visibleWhen>   
+            <with variable="selection">
                <iterate>
                   <adapt
                         type="org.eclipse.core.resources.IResource">
                   </adapt>
-               </iterate>  
+                  <and>
+                    <test
+                     property="com.google.dart.tools.debug.isInDartProject"
+                     value="true">
+                    </test>
+                  </and>
+               </iterate>               
            </with>
-           </and>
         </visibleWhen>
           <command
                 commandId="com.google.dart.tools.ui.commands.unIgnoreResource"
diff --git a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/AnalysisServer.java b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/AnalysisServer.java
index 004ad54..2f39f5e 100644
--- a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/AnalysisServer.java
+++ b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/AnalysisServer.java
@@ -263,7 +263,8 @@
    *
    * If a request is made for a file which does not exist, or which is not currently subject to
    * analysis (e.g. because it is not associated with any analysis root specified to
-   * analysis.setAnalysisRoots), an error of type FORMAT_INVALID_FILE will be generated.
+   * analysis.setAnalysisRoots), an error of type FORMAT_INVALID_FILE will be generated. If the
+   * source contains syntax errors, an error of type FORMAT_WITH_ERRORS will be generated.
    *
    * @param file The file containing the code to be formatted.
    * @param selectionOffset The offset of the current selection in the file.
diff --git a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestion.java b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestion.java
index 32b3f73..922dbf4 100644
--- a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestion.java
+++ b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestion.java
@@ -149,9 +149,15 @@
   private final String parameterType;
 
   /**
+   * The import to be added if the suggestion is out of scope and needs an import to be added to be
+   * in scope.
+   */
+  private final String importUri;
+
+  /**
    * Constructor for {@link CompletionSuggestion}.
    */
-  public CompletionSuggestion(String kind, int relevance, String completion, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType) {
+  public CompletionSuggestion(String kind, int relevance, String completion, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
@@ -170,6 +176,7 @@
     this.hasNamedParameters = hasNamedParameters;
     this.parameterName = parameterName;
     this.parameterType = parameterType;
+    this.importUri = importUri;
   }
 
   @Override
@@ -194,7 +201,8 @@
         ObjectUtilities.equals(other.requiredParameterCount, requiredParameterCount) &&
         ObjectUtilities.equals(other.hasNamedParameters, hasNamedParameters) &&
         ObjectUtilities.equals(other.parameterName, parameterName) &&
-        ObjectUtilities.equals(other.parameterType, parameterType);
+        ObjectUtilities.equals(other.parameterType, parameterType) &&
+        ObjectUtilities.equals(other.importUri, importUri);
     }
     return false;
   }
@@ -218,7 +226,8 @@
     Boolean hasNamedParameters = jsonObject.get("hasNamedParameters") == null ? null : jsonObject.get("hasNamedParameters").getAsBoolean();
     String parameterName = jsonObject.get("parameterName") == null ? null : jsonObject.get("parameterName").getAsString();
     String parameterType = jsonObject.get("parameterType") == null ? null : jsonObject.get("parameterType").getAsString();
-    return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType);
+    String importUri = jsonObject.get("importUri") == null ? null : jsonObject.get("importUri").getAsString();
+    return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
   }
 
   public static List<CompletionSuggestion> fromJsonArray(JsonArray jsonArray) {
@@ -282,6 +291,14 @@
   }
 
   /**
+   * The import to be added if the suggestion is out of scope and needs an import to be added to be
+   * in scope.
+   */
+  public String getImportUri() {
+    return importUri;
+  }
+
+  /**
    * True if the suggested element is deprecated.
    */
   public boolean isDeprecated() {
@@ -394,6 +411,7 @@
     builder.append(hasNamedParameters);
     builder.append(parameterName);
     builder.append(parameterType);
+    builder.append(importUri);
     return builder.toHashCode();
   }
 
@@ -447,6 +465,9 @@
     if (parameterType != null) {
       jsonObject.addProperty("parameterType", parameterType);
     }
+    if (importUri != null) {
+      jsonObject.addProperty("importUri", importUri);
+    }
     return jsonObject;
   }
 
@@ -489,7 +510,9 @@
     builder.append("parameterName=");
     builder.append(parameterName + ", ");
     builder.append("parameterType=");
-    builder.append(parameterType);
+    builder.append(parameterType + ", ");
+    builder.append("importUri=");
+    builder.append(importUri);
     builder.append("]");
     return builder.toString();
   }
diff --git a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestionKind.java b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestionKind.java
index 91eb389..3e79fab 100644
--- a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestionKind.java
+++ b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/CompletionSuggestionKind.java
@@ -51,6 +51,10 @@
    */
   public static final String KEYWORD = "KEYWORD";
 
+  /**
+   * A named argument for the current callsite is being suggested. For suggestions of this kind, the
+   * completion is the named argument identifier including a trailing ':' and space.
+   */
   public static final String NAMED_ARGUMENT = "NAMED_ARGUMENT";
 
   public static final String OPTIONAL_ARGUMENT = "OPTIONAL_ARGUMENT";
diff --git a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/RequestErrorCode.java b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/RequestErrorCode.java
index 5b3c6ca..99f418a 100644
--- a/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/RequestErrorCode.java
+++ b/dart/editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/RequestErrorCode.java
@@ -36,6 +36,11 @@
   public static final String FORMAT_INVALID_FILE = "FORMAT_INVALID_FILE";
 
   /**
+   * An "edit.format" request specified a file that contains syntax errors.
+   */
+  public static final String FORMAT_WITH_ERRORS = "FORMAT_WITH_ERRORS";
+
+  /**
    * An "analysis.getErrors" request specified a FilePath which does not match a file currently
    * subject to analysis.
    */
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core/.options b/dart/editor/tools/plugins/com.google.dart.tools.core/.options
index b069f08..2410693 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core/.options
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core/.options
@@ -47,6 +47,7 @@
 com.google.dart.tools.core/experimental/analysisServer/incrementalResolutionValidation = false
 com.google.dart.tools.core/experimental/analysisServer/instrumentationLogFile =
 com.google.dart.tools.core/experimental/analysisServer/logFile =
+com.google.dart.tools.core/experimental/analysisServer/newTaskModel = false
 com.google.dart.tools.core/experimental/analysisServer/path =
 com.google.dart.tools.core/experimental/analysisServer/printToConsole = false
 com.google.dart.tools.core/experimental/analysisServer/profile = false
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCore.java b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCore.java
index b77a1ae..d92dd5d 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCore.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCore.java
@@ -556,6 +556,9 @@
                 additionalArguments,
                 "--enable-incremental-resolution-api");
           }
+          if (DartCoreDebug.ANALYSIS_SERVER_NEW_TASK_MODEL) {
+            additionalArguments = ArrayUtils.add(additionalArguments, "--enable-new-task-model");
+          }
           {
             String log = DartCoreDebug.ANALYSIS_SERVER_INCREMENTAL_RESOLUTION_LOG;
             if (!StringUtils.isEmpty(log)) {
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCoreDebug.java b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCoreDebug.java
index e8c0813..f4ff3d0 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCoreDebug.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/DartCoreDebug.java
@@ -75,6 +75,8 @@
 
   public static final String ANALYSIS_SERVER_INSTRUMENTATION_LOG_FILE = getOptionValue("experimental/analysisServer/instrumentationLogFile");
 
+  public static final boolean ANALYSIS_SERVER_NEW_TASK_MODEL = isOptionTrue("experimental/analysisServer/newTaskModel");
+
   // http diagnostic port 
   public static final String ANALYSIS_SERVER_HTTP_PORT_PREF = "analysisServerHttpPort";
   public static final String ANALYSIS_SERVER_HTTP_PORT = getOptionOrPrefValue(
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/Stagehand.java b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/Stagehand.java
index f929407..1af673d 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/Stagehand.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/Stagehand.java
@@ -68,7 +68,7 @@
       int retValue = runner.runSync(null);
 
       if (retValue != 0) {
-        throw new StagehandException(runner.getStdErr());
+        throw new StagehandException(runner.getStdOut() + "\n" + runner.getStdErr());
       }
     } catch (IOException e) {
       throw new StagehandException(e);
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/StagehandSample.java b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/StagehandSample.java
index 7709849..57fd460 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/StagehandSample.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/generator/StagehandSample.java
@@ -77,6 +77,6 @@
 
   @Override
   public boolean shouldBeDefault() {
-    return getStagehandId().equals("consoleapp");
+    return getStagehandId().equals("console-full");
   }
 }
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/completion/DartSuggestionReceiverTest.java b/dart/editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/completion/DartSuggestionReceiverTest.java
index 14778df..e83f796 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/completion/DartSuggestionReceiverTest.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.core_test/src/com/google/dart/tools/core/completion/DartSuggestionReceiverTest.java
@@ -118,6 +118,7 @@
         null,
         null,
         null,
+        null,
         null));
     completions1.add(new CompletionSuggestion(
         "kind",
@@ -137,6 +138,7 @@
         null,
         null,
         null,
+        null,
         null));
 
     server = new MockServer(new Runnable() {
@@ -194,6 +196,7 @@
         null,
         null,
         null,
+        null,
         null));
     completions1.add(new CompletionSuggestion(
         "kind",
@@ -213,6 +216,7 @@
         null,
         null,
         null,
+        null,
         null));
     completions2.add(new CompletionSuggestion(
         "kind",
@@ -232,6 +236,7 @@
         null,
         null,
         null,
+        null,
         null));
 
     server = new MockServer(new Runnable() {
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/completion/DartServerProposalCollector.java b/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/completion/DartServerProposalCollector.java
index 589483e..564621d 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/completion/DartServerProposalCollector.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/completion/DartServerProposalCollector.java
@@ -102,8 +102,8 @@
       } else if (p instanceof DartServerInformationalProposal) {
         informational.add(p);
       }
-      filtered.addAll(Math.min(filtered.size(), 9), informational);
     }
+    filtered.addAll(Math.min(filtered.size(), 9), informational);
     if (filtered.isEmpty()) {
       filtered.add(DartServerInformationalProposal.NO_RESULTS_COMPLETE);
     }
diff --git a/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartServerProposal.java b/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartServerProposal.java
index c05976d..381df8b 100644
--- a/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartServerProposal.java
+++ b/dart/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartServerProposal.java
@@ -320,7 +320,7 @@
         // If Enter or '(' (when blind typing), then use linked mode.
       } else {
         // Insert the trigger and stop completion.
-        selectionOffset = completion.length();
+        selectionOffset = suggestion.getSelectionOffset();
         selectionLength = 0;
         if (!isTriggerEnter) {
           doc.replace(
diff --git a/dart/pkg/analysis_server/AUTHORS b/dart/pkg/analysis_server/AUTHORS
new file mode 100755
index 0000000..e8063a8
--- /dev/null
+++ b/dart/pkg/analysis_server/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/dart/pkg/analysis_server/CHANGELOG.md b/dart/pkg/analysis_server/CHANGELOG.md
new file mode 100755
index 0000000..2a2d63c
--- /dev/null
+++ b/dart/pkg/analysis_server/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## 0.0.1
+
+- Initial version
diff --git a/dart/pkg/analysis_server/CONTRIBUTING.md b/dart/pkg/analysis_server/CONTRIBUTING.md
new file mode 100755
index 0000000..6f5e0ea
--- /dev/null
+++ b/dart/pkg/analysis_server/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // 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.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/dart/pkg/analysis_server/README.md b/dart/pkg/analysis_server/README.md
new file mode 100755
index 0000000..e5d6caa
--- /dev/null
+++ b/dart/pkg/analysis_server/README.md
@@ -0,0 +1,21 @@
+# analysis_server
+
+A long-running process that provides analysis results to other tools.
+
+The analysis server is designed to provide on-going analysis of one or more code
+bases as those code bases are changing.
+
+## Using the server
+
+The analysis server is not intended to be used stand-alone, and therefore does
+not have a human-friendly user interface.
+
+Clients (typically tools, such as an editor) are expected to run the analysis
+server in a separate process and communicate with it using a JSON protocol. The
+protocol is specified in the file `analysis_server/doc/api.html`.
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://code.google.com/p/dart/issues
\ No newline at end of file
diff --git a/dart/pkg/analysis_server/doc/api.html b/dart/pkg/analysis_server/doc/api.html
index 59a5359..2b31520 100644
--- a/dart/pkg/analysis_server/doc/api.html
+++ b/dart/pkg/analysis_server/doc/api.html
@@ -43,7 +43,7 @@
 </style></head>
   <body>
     <h1>Analysis Server API Specification</h1>
-    <h1 style="color:#999999">Version 1.6.0</h1>
+    <h1 style="color:#999999">Version 1.6.2</h1>
     <p>
       This document contains a specification of the API provided by the
       analysis server.  The API in this document is currently under
@@ -1545,11 +1545,12 @@
           selection offset and selection length.
         </p>
         <p>
-          If a request is made for a file which does not exist, or
-          which is not currently subject to analysis (e.g. because it
-          is not associated with any analysis root specified to
-          analysis.setAnalysisRoots), an error of type
-          <tt>FORMAT_INVALID_FILE</tt> will be generated.
+          If a request is made for a file which does not exist, or which is not
+          currently subject to analysis (e.g. because it is not associated with
+          any analysis root specified to analysis.setAnalysisRoots), an error of
+          type <tt>FORMAT_INVALID_FILE</tt> will be generated. If the source
+          contains syntax errors, an error of type <tt>FORMAT_WITH_ERRORS</tt>
+          will be generated.
         </p>
         
         
@@ -2445,6 +2446,12 @@
               The type of the options parameter being suggested. This
               field is omitted if the parameterName field is omitted.
             </p>
+          </dd><dt class="field"><b><i>importUri ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
+            
+            <p>
+              The import to be added if the suggestion is out of scope
+              and needs an import to be added to be in scope.
+            </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionSuggestionKind">CompletionSuggestionKind: String</a></dt><dd>
         <p>
           An enumeration of the kinds of elements that can be included
@@ -2481,7 +2488,14 @@
               A keyword is being suggested.
               For suggestions of this kind, the completion is the keyword.
             </p>
-          </dd><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
+          </dd><dt class="value">NAMED_ARGUMENT</dt><dd>
+            
+            <p>
+              A named argument for the current callsite is being suggested.
+              For suggestions of this kind, the completion is
+              the named argument identifier including a trailing ':' and space.
+            </p>
+          </dd><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
         <p>
           Information about an element (something that can be declared
           in code).
@@ -3128,6 +3142,12 @@
               An "edit.format" request specified a FilePath
               which does not match a Dart file in an analysis root.
             </p>
+          </dd><dt class="value">FORMAT_WITH_ERRORS</dt><dd>
+            
+            <p>
+              An "edit.format" request specified a file that contains syntax
+              errors.
+            </p>
           </dd><dt class="value">GET_ERRORS_INVALID_FILE</dt><dd>
             
             <p>
diff --git a/dart/pkg/analysis_server/lib/analysis/index/index_core.dart b/dart/pkg/analysis_server/lib/analysis/index/index_core.dart
new file mode 100644
index 0000000..e712495
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/analysis/index/index_core.dart
@@ -0,0 +1,185 @@
+// 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.analysis.index.index_core;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * An object that can have a [Relationship] with various [Location]s in a code
+ * base.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class IndexableObject {
+  // TODO(brianwilkerson) Figure out the subset of the Element API that is used
+  // by the index.
+}
+
+/**
+ * An object used to add relationships to the index.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class IndexContributor {
+  /**
+   * Contribute relationships to the given index [store] as a result of
+   * analyzing the given [source] in the given [context].
+   */
+  void contributeTo(IndexStore store, AnalysisContext context, Source source);
+}
+
+// A sketch of what the driver routine might look like:
+//
+//void buildIndexForSource(AnalysisContext context, Source source) {
+//  IndexStoreImpl store;
+//  store.aboutToIndex(context, source);
+//  try {
+//    for (IndexContributor contributor in contributors) {
+//      contributor.contributeTo(store, context, source);
+//    }
+//  } finally {
+//    store.doneIndexing();
+//  }
+//}
+
+/**
+ * An object that stores information about the relationships between locations
+ * in a code base.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class IndexStore {
+  /**
+   * Remove all of the information from the index.
+   */
+  void clear();
+
+  /**
+   * Return a future that completes with the locations that have the given
+   * [relationship] with the given [indexable] object.
+   *
+   * For example, if the [indexable] object represents a function and the
+   * relationship is the `is-invoked-by` relationship, then the returned
+   * locations will be all of the places where the function is invoked.
+   */
+  Future<List<Location>> getRelationships(
+      IndexableObject indexable, Relationship relationship);
+
+  /**
+   * Record that the given [indexable] object and [location] have the given
+   * [relationship].
+   *
+   * For example, if the [relationship] is the `is-invoked-by` relationship,
+   * then the [indexable] object would be the function being invoked and
+   * [location] would be the point at which it is invoked. Each indexable object
+   * can have the same relationship with multiple locations. In other words, if
+   * the following code were executed
+   *
+   *     recordRelationship(indexable, isReferencedBy, location1);
+   *     recordRelationship(indexable, isReferencedBy, location2);
+   *
+   * (where `location1 != location2`) then both relationships would be
+   * maintained in the index and the result of executing
+   *
+   *     getRelationship(indexable, isReferencedBy);
+   *
+   * would be a list containing both `location1` and `location2`.
+   */
+  void recordRelationship(
+      IndexableObject indexable, Relationship relationship, Location location);
+
+  /**
+   * Remove from the index all of the information associated with the given
+   * [context].
+   *
+   * This method should be invoked when the [context] is disposed.
+   */
+  void removeContext(AnalysisContext context);
+
+  /**
+   * Remove from the index all of the information associated with indexable
+   * objects or locations in the given [source]. This includes relationships
+   * between an indexable object in [source] and any other locations, as well as
+   * relationships between any other indexable objects and locations within
+   * the [source].
+   *
+   * This method should be invoked when [source] is no longer part of the given
+   * [context].
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Remove from the index all of the information associated with indexable
+   * objects or locations in the given sources. This includes relationships
+   * between an indexable object in the given sources and any other locations,
+   * as well as relationships between any other indexable objects and a location
+   * within the given sources.
+   *
+   * This method should be invoked when the sources described by the given
+   * [container] are no longer part of the given [context].
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+}
+
+/**
+ * Instances of the class [Location] represent a location related to an
+ * indexable object.
+ *
+ * The location is expressed as an offset and length, but the offset is relative
+ * 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.
+ */
+abstract class Location {
+  /**
+   * An empty list of locations.
+   */
+  static const List<Location> EMPTY_LIST = const <Location>[];
+
+  /**
+   * Return the indexable object containing this location.
+   */
+  IndexableObject get indexable;
+
+  /**
+   * Return `true` if this location is a qualified reference.
+   */
+  bool get isQualified;
+
+  /**
+   * Return `true` if this location is a resolved reference.
+   */
+  bool get isResolved;
+
+  /**
+   * Return the length of this location.
+   */
+  int get length;
+
+  /**
+   * Return the offset of this location within the source containing the
+   * indexable object.
+   */
+  int get offset;
+}
+
+/**
+ * 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.
+ */
+abstract class Relationship {
+  /**
+   * Return a relationship that has the given [identifier]. If the relationship
+   * has already been created, then it will be returned, otherwise a new
+   * relationship will be created
+   */
+  factory Relationship(String identifier) => null;
+}
diff --git a/dart/pkg/analysis_server/lib/analysis/index/index_dart.dart b/dart/pkg/analysis_server/lib/analysis/index/index_dart.dart
new file mode 100644
index 0000000..ed1869f
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/analysis/index/index_dart.dart
@@ -0,0 +1,41 @@
+// 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.analysis.index.index_dart;
+
+import 'package:analysis_server/analysis/index/index_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * An [IndexContributor] that can be used to contribute relationships for Dart
+ * files.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class DartIndexContributor extends IndexContributor {
+  @override
+  void contributeTo(IndexStore store, AnalysisContext context, Source source) {
+    if (!AnalysisEngine.isDartFileName(source.fullName)) {
+      return;
+    }
+    List<Source> libraries = context.getLibrariesContaining(source);
+    if (libraries.isEmpty) {
+      return;
+    }
+    libraries.forEach((Source library) {
+      CompilationUnit unit = context.resolveCompilationUnit2(source, library);
+      if (unit != null) {
+        internalContributeTo(store, unit);
+      }
+    });
+  }
+
+  /**
+   * Contribute relationships to the given index [store] based on the given
+   * fully resolved compilation[unit].
+   */
+  void internalContributeTo(IndexStore store, CompilationUnit unit);
+}
diff --git a/dart/pkg/analysis_server/lib/completion/completion_core.dart b/dart/pkg/analysis_server/lib/completion/completion_core.dart
new file mode 100644
index 0000000..691ab89
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/completion/completion_core.dart
@@ -0,0 +1,106 @@
+// 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.completion.completion_core;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * An object used to produce completions for a specific error. 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.
+ */
+abstract class CompletionContributor {
+  /**
+   * Compute a list of completion suggestions based on the given completion
+   * [request] and return a result that includes those suggestions. This method
+   * is called after specific phases of analysis until the contributor indicates
+   * computation is complete by setting [CompletionResult.isLast] to `true`.
+   */
+  CompletionResult computeSuggestions(CompletionRequest request);
+}
+
+/**
+ * The information about a requested list of completions.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class CompletionRequest {
+  /**
+   * Return the results that were returned the last time the contributor was
+   * asked for results, or `null` if this is the first request for results at
+   * this location.
+   */
+  //CompletionResult get previousResults;
+
+  /**
+   * Return the analysis context in which the completion is being requested.
+   */
+  AnalysisContext get context;
+
+  /**
+   * The offset within the source at which the completion is being requested.
+   */
+  int get offset;
+
+  /**
+   * Return the resource provider associated with this request.
+   */
+  ResourceProvider get resourceProvider;
+
+  /**
+   * Return the source in which the completion is being requested.
+   */
+  Source get source;
+}
+
+/**
+ * The result of computing suggestions for code completion.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class CompletionResult {
+  /**
+   * Return `true` if this result contains suggestions that were not in the
+   * previously returned completion results. This should also be `true` if this
+   * is the first result produced for a given location.
+   */
+  bool get hasNewSuggestions;
+
+  /**
+   * Return `true` if the contributor has contributed all possible completion
+   * suggestions, or `false` if the contributor should be consulted again after
+   * more analysis has been completed.
+   */
+  bool get isLast;
+
+  /**
+   * Return the length of the text to be replaced. This will be zero (0) if the
+   * suggestion is to be inserted, otherwise it will be greater than zero. For
+   * example, if the remainder of the identifier containing the cursor is to be
+   * replaced when the suggestion is applied, in which case the length will be
+   * the number of characters in the existing identifier.
+   */
+  int get replacementLength;
+
+  /**
+   * Return the offset of the start of the text to be replaced. This will be
+   * different than the offset used to request the completion suggestions if
+   * there was a portion of text that needs to be replaced. For example, if a
+   * partial identifier is immediately before the original offset, in which case
+   * the replacementOffset will be the offset of the beginning of the
+   * identifier.
+   */
+  int get replacementOffset;
+
+  /**
+   * Return the list of suggestions being contributed by the contributor.
+   */
+  List<CompletionSuggestion> get suggestions;
+}
diff --git a/dart/pkg/analysis_server/lib/completion/completion_dart.dart b/dart/pkg/analysis_server/lib/completion/completion_dart.dart
new file mode 100644
index 0000000..daeba77
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/completion/completion_dart.dart
@@ -0,0 +1,64 @@
+// 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.completion.completion_dart;
+
+import 'package:analysis_server/completion/completion_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+
+/**
+ * An object used to produce completions for a specific error within a Dart
+ * 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.
+ */
+abstract class DartCompletionContributor extends CompletionContributor {
+  @override
+  CompletionResult computeSuggestions(CompletionRequest request) {
+    // TODO(brianwilkerson) Implement this by getting the information required
+    // to create a DartCompletionRequest and calling:
+    // return internalComputeSuggestions(dartRequest);
+    return null;
+  }
+
+  /**
+   * Compute a list of completion suggestions based on the given completion
+   * [request] and return a result that includes those suggestions. This method
+   * is called after specific phases of analysis until the contributor indicates
+   * computation is complete by setting [CompletionResult.isLast] to `true`.
+   */
+  CompletionResult internalComputeSuggestions(DartCompletionRequest request);
+}
+
+/**
+ * The information about a requested list of completions within a Dart file.
+ */
+abstract class DartCompletionRequest extends CompletionRequest {
+  /**
+   * Return `true` if the compilation [unit] is resolved.
+   */
+  bool get isResolved;
+
+  /**
+   * The compilation unit in which the completion was requested.
+   */
+  CompilationUnit get unit;
+
+  /**
+   * Cached information from a prior code completion operation.
+   */
+  //DartCompletionCache get cache;
+
+  /**
+   * The completion target.  This determines what part of the parse tree
+   * will receive the newly inserted text.
+   */
+  //CompletionTarget get target;
+
+  /**
+   * Information about the types of suggestions that should be included.
+   */
+  //OpType get _optype;
+}
diff --git a/dart/pkg/analysis_server/lib/edit/assist/assist_core.dart b/dart/pkg/analysis_server/lib/edit/assist/assist_core.dart
new file mode 100644
index 0000000..537791c
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/edit/assist/assist_core.dart
@@ -0,0 +1,99 @@
+// 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.edit.assist.assist_core;
+
+import 'package:analysis_server/src/protocol.dart' show SourceChange;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A description of a single proposed assist.
+ *
+ * Clients are not expected to subtype this class.
+ */
+class Assist {
+  /**
+   * An empty list of assists.
+   */
+  static const List<Assist> EMPTY_LIST = const <Assist>[];
+
+  /**
+   * A comparator that can be used to sort assists by their relevance. The most
+   * relevant assists will be sorted before assists with a lower relevance.
+   */
+  static final Comparator<Assist> SORT_BY_RELEVANCE = (Assist firstAssist,
+          Assist secondAssist) =>
+      firstAssist.kind.relevance - secondAssist.kind.relevance;
+
+  /**
+   * A description of the assist being proposed.
+   */
+  final AssistKind kind;
+
+  /**
+   * The change to be made in order to apply the assist.
+   */
+  final SourceChange change;
+
+  /**
+   * Initialize a newly created assist to have the given [kind] and [change].
+   */
+  Assist(this.kind, this.change);
+
+  @override
+  String toString() {
+    return 'Assist(kind=$kind, change=$change)';
+  }
+}
+
+/**
+ * An object used to produce assists for a specific location.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class AssistContributor {
+  /**
+   * Return a list of assists for a location in the given [source]. The location
+   * is specified by the [offset] and [length] of the selected region. The
+   * [context] can be used to get additional information that is useful for
+   * computing assists.
+   */
+  List<Assist> computeAssists(
+      AnalysisContext context, Source source, int offset, int length);
+}
+
+/**
+ * A description of a class of assists. Instances are intended to hold the
+ * information that is common across a number of assists and to be shared by
+ * those assists.
+ *
+ * Clients are not expected to subtype this class.
+ */
+class AssistKind {
+  /**
+   * The name of this kind of assist, used for debugging.
+   */
+  final String name;
+
+  /**
+   * The relevance of this kind of assist for the kind of error being addressed.
+   */
+  final int relevance;
+
+  /**
+   * A human-readable description of the changes that will be applied by this
+   * kind of assist.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created kind of assist to have the given [name],
+   * [relevance] and [message].
+   */
+  const AssistKind(this.name, this.relevance, this.message);
+
+  @override
+  String toString() => name;
+}
diff --git a/dart/pkg/analysis_server/lib/edit/assist/assist_dart.dart b/dart/pkg/analysis_server/lib/edit/assist/assist_dart.dart
new file mode 100644
index 0000000..ec6718c
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/edit/assist/assist_dart.dart
@@ -0,0 +1,45 @@
+// 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.edit.assist.assist_dart;
+
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * An [AssistContributor] that can be used to contribute assists for Dart
+ * files.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class DartAssistContributor extends AssistContributor {
+  @override
+  List<Assist> computeAssists(
+      AnalysisContext context, Source source, int offset, int length) {
+    if (!AnalysisEngine.isDartFileName(source.fullName)) {
+      return Assist.EMPTY_LIST;
+    }
+    List<Source> libraries = context.getLibrariesContaining(source);
+    if (libraries.isEmpty) {
+      return Assist.EMPTY_LIST;
+    }
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(source, libraries[0]);
+    if (unit == null) {
+      return Assist.EMPTY_LIST;
+    }
+    return internalComputeAssists(unit, offset, length);
+  }
+
+  /**
+   * Return a list of assists for a location in the given [source]. The location
+   * is specified by the [offset] and [length] of the selected region. The
+   * [context] can be used to get additional information that is useful for
+   * computing assists.
+   */
+  List<Assist> internalComputeAssists(
+      CompilationUnit unit, int offset, int length);
+}
diff --git a/dart/pkg/analysis_server/lib/edit/fix/fix_core.dart b/dart/pkg/analysis_server/lib/edit/fix/fix_core.dart
new file mode 100644
index 0000000..f546198
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/edit/fix/fix_core.dart
@@ -0,0 +1,100 @@
+// 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.edit.fix.fix_core;
+
+import 'package:analysis_server/src/protocol.dart' show SourceChange;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+
+/**
+ * A description of a single proposed fix for some problem.
+ *
+ * Clients are not expected to subtype this class.
+ */
+class Fix {
+  /**
+   * An empty list of fixes.
+   */
+  static const List<Fix> EMPTY_LIST = const <Fix>[];
+
+  /**
+   * A comparator that can be used to sort fixes by their relevance. The most
+   * relevant fixes will be sorted before fixes with a lower relevance.
+   */
+  static final Comparator<Fix> SORT_BY_RELEVANCE = (Fix firstFix,
+      Fix secondFix) => firstFix.kind.relevance - secondFix.kind.relevance;
+
+  /**
+   * A description of the fix being proposed.
+   */
+  final FixKind kind;
+
+  /**
+   * The change to be made in order to apply the fix.
+   */
+  final SourceChange change;
+
+  /**
+   * Initialize a newly created fix to have the given [kind] and [change].
+   */
+  Fix(this.kind, this.change);
+
+  @override
+  String toString() {
+    return 'Fix(kind=$kind, change=$change)';
+  }
+}
+
+/**
+ * An object used to produce fixes for a specific error. Fix contributors are
+ * long-lived objects and must not retain any state between invocations of
+ * [computeFixes].
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class FixContributor {
+  /**
+   * Return a list of fixes for the given [error]. The error was reported
+   * after it's source was analyzed in the given [context].
+   */
+  List<Fix> computeFixes(AnalysisContext context, AnalysisError error);
+}
+
+/**
+ * A description of a class of fixes. Instances are intended to hold the
+ * information that is common across a number of fixes and to be shared by those
+ * fixes. For example, if an unnecessary cast is found then one of the suggested
+ * fixes will be to remove the cast. If there are multiple unnecessary casts in
+ * 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.
+ */
+class FixKind {
+  /**
+   * The name of this kind of fix, used for debugging.
+   */
+  final String name;
+
+  /**
+   * The relevance of this kind of fix for the kind of error being addressed.
+   */
+  final int relevance;
+
+  /**
+   * A human-readable description of the changes that will be applied by this
+   * kind of fix.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created kind of fix to have the given [name],
+   * [relevance] and [message].
+   */
+  const FixKind(this.name, this.relevance, this.message);
+
+  @override
+  String toString() => name;
+}
diff --git a/dart/pkg/analysis_server/lib/edit/fix/fix_dart.dart b/dart/pkg/analysis_server/lib/edit/fix/fix_dart.dart
new file mode 100644
index 0000000..0e559e4
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/edit/fix/fix_dart.dart
@@ -0,0 +1,43 @@
+// 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.edit.fix.fix_dart;
+
+import 'package:analysis_server/edit/fix/fix_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A [FixContributor] that can be used to contribute fixes for errors in Dart
+ * files.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class DartFixContributor extends FixContributor {
+  @override
+  List<Fix> computeFixes(AnalysisContext context, AnalysisError error) {
+    Source source = error.source;
+    if (!AnalysisEngine.isDartFileName(source.fullName)) {
+      return Fix.EMPTY_LIST;
+    }
+    List<Source> libraries = context.getLibrariesContaining(source);
+    if (libraries.isEmpty) {
+      return Fix.EMPTY_LIST;
+    }
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(source, libraries[0]);
+    if (unit == null) {
+      return Fix.EMPTY_LIST;
+    }
+    return internalComputeFixes(unit, error);
+  }
+
+  /**
+   * Return a list of fixes for the given [error]. The error was reported
+   * against the given compilation [unit].
+   */
+  List<Fix> internalComputeFixes(CompilationUnit unit, AnalysisError error);
+}
diff --git a/dart/pkg/analysis_server/lib/plugin/assist.dart b/dart/pkg/analysis_server/lib/plugin/assist.dart
new file mode 100644
index 0000000..f578c0d
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/plugin/assist.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/**
+ * Support for client code that extends the analysis server by adding new assist
+ * contributors.
+ */
+library analysis_server.plugin.assist;
+
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * assist contributors with the server. The object used as an extension must be
+ * an [AssistContributor].
+ */
+final String ASSIST_CONTRIBUTOR_EXTENSION_POINT_ID = Plugin.join(
+    ServerPlugin.UNIQUE_IDENTIFIER,
+    ServerPlugin.ASSIST_CONTRIBUTOR_EXTENSION_POINT);
diff --git a/dart/pkg/analysis_server/lib/plugin/completion.dart b/dart/pkg/analysis_server/lib/plugin/completion.dart
new file mode 100644
index 0000000..a1947e5
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/plugin/completion.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/**
+ * Support for client code that extends the analysis server by adding new code
+ * completion contributors.
+ */
+library analysis_server.plugin.completion;
+
+import 'package:analysis_server/completion/completion_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * code completion contributors with the server. The object used as an extension
+ * must be a [CompletionContributor].
+ */
+final String COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID = Plugin.join(
+    ServerPlugin.UNIQUE_IDENTIFIER,
+    ServerPlugin.COMPLETION_CONTRIBUTOR_EXTENSION_POINT);
diff --git a/dart/pkg/analysis_server/lib/plugin/fix.dart b/dart/pkg/analysis_server/lib/plugin/fix.dart
new file mode 100644
index 0000000..8045624
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/plugin/fix.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/**
+ * Support for client code that extends the analysis server by adding new fix
+ * contributors.
+ */
+library analysis_server.plugin.fix;
+
+import 'package:analysis_server/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * fix contributors with the server. The object used as an extension must be a
+ * [FixContributor].
+ */
+final String FIX_CONTRIBUTOR_EXTENSION_POINT_ID = Plugin.join(
+    ServerPlugin.UNIQUE_IDENTIFIER,
+    ServerPlugin.FIX_CONTRIBUTOR_EXTENSION_POINT);
diff --git a/dart/pkg/analysis_server/lib/plugin/index.dart b/dart/pkg/analysis_server/lib/plugin/index.dart
new file mode 100644
index 0000000..e8bcf89
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/plugin/index.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/**
+ * Support for client code that extends the analysis server by adding new index
+ * contributors.
+ */
+library analysis_server.plugin.index;
+
+import 'package:analysis_server/analysis/index/index_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * index contributors with the server. The object used as an extension must be
+ * an [IndexContributor].
+ */
+final String INDEX_CONTRIBUTOR_EXTENSION_POINT_ID = Plugin.join(
+    ServerPlugin.UNIQUE_IDENTIFIER,
+    ServerPlugin.INDEX_CONTRIBUTOR_EXTENSION_POINT);
diff --git a/dart/pkg/analysis_server/lib/src/analysis_server.dart b/dart/pkg/analysis_server/lib/src/analysis_server.dart
index 4989c15..121227a 100644
--- a/dart/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/dart/pkg/analysis_server/lib/src/analysis_server.dart
@@ -21,7 +21,6 @@
 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/plugin.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -30,6 +29,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:plugin/plugin.dart';
 
 typedef void OptionUpdater(AnalysisOptionsImpl options);
 
@@ -66,7 +66,7 @@
    * The version of the analysis server. The value should be replaced
    * automatically during the build.
    */
-  static final String VERSION = '1.6.0';
+  static final String VERSION = '1.6.2';
 
   /**
    * The number of milliseconds to perform operations before inserting
@@ -425,9 +425,10 @@
    * first context that implicitly analyzes it.
    *
    * If the [path] is not analyzed by any context, a [ContextSourcePair] with
-   * `null` context and `file` [Source] is returned.
+   * a `null` context and `file` [Source] is returned.
    *
-   * If the [path] dosn't represent a file, `null` is returned as a [Source].
+   * If the [path] dosn't represent a file, a [ContextSourcePair] with a `null`
+   * context and `null` [Source] is returned.
    *
    * Does not return `null`.
    */
@@ -443,21 +444,21 @@
     }
     // try to find the deep-most containing context
     Resource resource = resourceProvider.getResource(path);
-    File file = resource is File ? resource : null;
+    if (resource is! File) {
+      return new ContextSourcePair(null, null);
+    }
+    File file = resource;
     {
       AnalysisContext containingContext = getContainingContext(path);
       if (containingContext != null) {
-        Source source = file != null
-            ? ContextManager.createSourceInContext(containingContext, file)
-            : null;
+        Source source =
+            ContextManager.createSourceInContext(containingContext, file);
         return new ContextSourcePair(containingContext, source);
       }
     }
     // try to find a context that analysed the file
     for (AnalysisContext context in folderMap.values) {
-      Source source = file != null
-          ? ContextManager.createSourceInContext(context, file)
-          : null;
+      Source source = ContextManager.createSourceInContext(context, file);
       SourceKind kind = context.getKindOf(source);
       if (kind != SourceKind.UNKNOWN) {
         return new ContextSourcePair(context, source);
@@ -472,7 +473,7 @@
       }
     }
     // file-based source
-    Source fileSource = file != null ? file.createSource() : null;
+    Source fileSource = file.createSource();
     return new ContextSourcePair(null, fileSource);
   }
 
diff --git a/dart/pkg/analysis_server/lib/src/context_manager.dart b/dart/pkg/analysis_server/lib/src/context_manager.dart
index bd3dc86..e010a3e 100644
--- a/dart/pkg/analysis_server/lib/src/context_manager.dart
+++ b/dart/pkg/analysis_server/lib/src/context_manager.dart
@@ -389,7 +389,29 @@
   UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) {
     if (info.packageRoot != null) {
       info.packageMapInfo = null;
-      return new PackageUriResolver([new JavaFile(info.packageRoot)]);
+      JavaFile packagesDir = new JavaFile(info.packageRoot);
+      Map<String, List<Folder>> packageMap = new Map<String, List<Folder>>();
+      if (packagesDir.isDirectory()) {
+        for (JavaFile file in packagesDir.listFiles()) {
+          // Ensure symlinks in packages directory are canonicalized
+          // to prevent 'type X cannot be assigned to type X' warnings
+          String path;
+          try {
+            path = file.getCanonicalPath();
+          } catch (e, s) {
+            // Ignore packages that do not exist
+            _instrumentationService.logException(e, s);
+            continue;
+          }
+          Resource res = resourceProvider.getResource(path);
+          if (res is Folder) {
+            packageMap[file.getName()] = <Folder>[res];
+          }
+        }
+        return new PackageMapUriResolver(resourceProvider, packageMap);
+      }
+      //TODO(danrubel) remove this if it will never be called
+      return new PackageUriResolver([packagesDir]);
     } else {
       beginComputePackageMap();
       OptimizingPubPackageMapInfo packageMapInfo;
diff --git a/dart/pkg/analysis_server/lib/src/domain_completion.dart b/dart/pkg/analysis_server/lib/src/domain_completion.dart
index 70808d5..cd9b426 100644
--- a/dart/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/dart/pkg/analysis_server/lib/src/domain_completion.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/completion/completion_core.dart'
+    show CompletionRequest;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -23,6 +25,11 @@
  */
 class CompletionDomainHandler implements RequestHandler {
   /**
+   * The maximum number of performance measurements to keep.
+   */
+  static const int performanceListMaxLength = 50;
+
+  /**
    * The analysis server that is using this handler to process requests.
    */
   final AnalysisServer server;
@@ -61,11 +68,6 @@
       new List<CompletionPerformance>();
 
   /**
-   * The maximum number of performance measurements to keep.
-   */
-  static const int performanceListMaxLength = 50;
-
-  /**
    * Performance for the last priority change event.
    */
   CompletionPerformance computeCachePerformance;
@@ -157,7 +159,7 @@
       String computeTag = 'computeCache';
       performance.logStartTime(computeTag);
       CompletionManager manager = completionManagerFor(context, source);
-      manager.computeCache().then((bool success) {
+      manager.computeCache().catchError((_) => false).then((bool success) {
         performance.logElapseTime(computeTag);
         performance.complete('priorityChanged caching: $success');
       });
@@ -185,7 +187,7 @@
       manager = completionManagerFor(context, source);
     }
     CompletionRequest completionRequest =
-        new CompletionRequest(params.offset, performance);
+        new CompletionRequestImpl(server, context, source, params.offset);
     int notificationCount = 0;
     manager.results(completionRequest).listen((CompletionResult result) {
       ++notificationCount;
diff --git a/dart/pkg/analysis_server/lib/src/domain_execution.dart b/dart/pkg/analysis_server/lib/src/domain_execution.dart
index 59d70af..145f1ba 100644
--- a/dart/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/dart/pkg/analysis_server/lib/src/domain_execution.dart
@@ -96,7 +96,7 @@
       return new Response.invalidParameter(request, 'id',
           'There is no execution context with an id of $contextId');
     }
-    AnalysisContext context = server.getAnalysisContext(path);
+    AnalysisContext context = server.getContainingContext(path);
     if (context == null) {
       return new Response.invalidExecutionContext(request, contextId);
     }
diff --git a/dart/pkg/analysis_server/lib/src/edit/edit_domain.dart b/dart/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 9d4c7df..8e11600 100644
--- a/dart/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/dart/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -6,9 +6,12 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analysis_server/edit/fix/fix_core.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -40,6 +43,11 @@
   final AnalysisServer server;
 
   /**
+   * The server plugin that defines the extension points used by this handler.
+   */
+  final ServerPlugin plugin;
+
+  /**
    * The [SearchEngine] for this server.
    */
   SearchEngine searchEngine;
@@ -49,7 +57,7 @@
   /**
    * Initialize a newly created handler to handle requests for the given [server].
    */
-  EditDomainHandler(this.server) {
+  EditDomainHandler(this.server, this.plugin) {
     searchEngine = server.searchEngine;
     _newRefactoringManager();
   }
@@ -90,7 +98,12 @@
         selectionStart: start,
         selectionLength: length);
     DartFormatter formatter = new DartFormatter();
-    SourceCode formattedResult = formatter.formatSource(code);
+    SourceCode formattedResult;
+    try {
+      formattedResult = formatter.formatSource(code);
+    } on FormatterException {
+      return new Response.formatWithErrors(request);
+    }
     String formattedSource = formattedResult.text;
 
     List<SourceEdit> edits = <SourceEdit>[];
@@ -102,23 +115,35 @@
       edits.add(edit);
     }
 
-    return new EditFormatResult(edits, formattedResult.selectionStart,
-        formattedResult.selectionLength).toResponse(request.id);
+    int newStart = formattedResult.selectionStart;
+    int newLength = formattedResult.selectionLength;
+
+    // Sending null start/length values would violate protocol, so convert back
+    // to 0.
+    if (newStart == null) {
+      newStart = 0;
+    }
+    if (newLength == null) {
+      newLength = 0;
+    }
+
+    return new EditFormatResult(edits, newStart, newLength)
+        .toResponse(request.id);
   }
 
   Response getAssists(Request request) {
-    var params = new EditGetAssistsParams.fromRequest(request);
+    EditGetAssistsParams params = new EditGetAssistsParams.fromRequest(request);
+    ContextSourcePair pair = server.getContextSourcePair(params.file);
+    engine.AnalysisContext context = pair.context;
+    Source source = pair.source;
     List<SourceChange> changes = <SourceChange>[];
-    List<CompilationUnit> units =
-        server.getResolvedCompilationUnits(params.file);
-    if (units.isNotEmpty) {
-      CompilationUnit unit = units[0];
-      List<Assist> assists = computeAssists(unit, params.offset, params.length);
+    if (context != null && source != null) {
+      List<Assist> assists =
+          computeAssists(plugin, context, source, params.offset, params.length);
       assists.forEach((Assist assist) {
         changes.add(assist.change);
       });
     }
-    // respond
     return new EditGetAssistsResult(changes).toResponse(request.id);
   }
 
@@ -137,7 +162,7 @@
         for (engine.AnalysisError error in errorInfo.errors) {
           int errorLine = lineInfo.getLocation(error.offset).lineNumber;
           if (errorLine == requestLine) {
-            List<Fix> fixes = computeFixes(unit, error);
+            List<Fix> fixes = computeFixes(plugin, unit.element.context, error);
             if (fixes.isNotEmpty) {
               AnalysisError serverError =
                   newAnalysisError_fromEngine(lineInfo, error);
@@ -469,7 +494,7 @@
         refactoring = new ExtractMethodRefactoring(
             searchEngine, units[0], offset, length);
         feedback = new ExtractMethodFeedback(
-            offset, length, null, [], false, [], [], []);
+            offset, length, '', [], false, [], [], []);
       }
     }
     if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) {
diff --git a/dart/pkg/analysis_server/lib/src/generated_protocol.dart b/dart/pkg/analysis_server/lib/src/generated_protocol.dart
index 27ad110..57fcf60 100644
--- a/dart/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/dart/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -37,12 +37,24 @@
  * }
  */
 class ServerGetVersionResult implements HasToJson {
+  String _version;
+
   /**
    * The version number of the analysis server.
    */
-  String version;
+  String get version => _version;
 
-  ServerGetVersionResult(this.version);
+  /**
+   * The version number of the analysis server.
+   */
+  void set version(String value) {
+    assert(value != null);
+    this._version = value;
+  }
+
+  ServerGetVersionResult(String version) {
+    this.version = version;
+  }
 
   factory ServerGetVersionResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -145,12 +157,24 @@
  * }
  */
 class ServerSetSubscriptionsParams implements HasToJson {
+  List<ServerService> _subscriptions;
+
   /**
    * A list of the services being subscribed to.
    */
-  List<ServerService> subscriptions;
+  List<ServerService> get subscriptions => _subscriptions;
 
-  ServerSetSubscriptionsParams(this.subscriptions);
+  /**
+   * A list of the services being subscribed to.
+   */
+  void set subscriptions(List<ServerService> value) {
+    assert(value != null);
+    this._subscriptions = value;
+  }
+
+  ServerSetSubscriptionsParams(List<ServerService> subscriptions) {
+    this.subscriptions = subscriptions;
+  }
 
   factory ServerSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -232,12 +256,24 @@
  * }
  */
 class ServerConnectedParams implements HasToJson {
+  String _version;
+
   /**
    * The version number of the analysis server.
    */
-  String version;
+  String get version => _version;
 
-  ServerConnectedParams(this.version);
+  /**
+   * The version number of the analysis server.
+   */
+  void set version(String value) {
+    assert(value != null);
+    this._version = value;
+  }
+
+  ServerConnectedParams(String version) {
+    this.version = version;
+  }
 
   factory ServerConnectedParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -300,24 +336,60 @@
  * }
  */
 class ServerErrorParams implements HasToJson {
+  bool _isFatal;
+
+  String _message;
+
+  String _stackTrace;
+
   /**
    * True if the error is a fatal error, meaning that the server will shutdown
    * automatically after sending this notification.
    */
-  bool isFatal;
+  bool get isFatal => _isFatal;
+
+  /**
+   * True if the error is a fatal error, meaning that the server will shutdown
+   * automatically after sending this notification.
+   */
+  void set isFatal(bool value) {
+    assert(value != null);
+    this._isFatal = value;
+  }
 
   /**
    * The error message indicating what kind of error was encountered.
    */
-  String message;
+  String get message => _message;
+
+  /**
+   * The error message indicating what kind of error was encountered.
+   */
+  void set message(String value) {
+    assert(value != null);
+    this._message = value;
+  }
 
   /**
    * The stack trace associated with the generation of the error, used for
    * debugging the server.
    */
-  String stackTrace;
+  String get stackTrace => _stackTrace;
 
-  ServerErrorParams(this.isFatal, this.message, this.stackTrace);
+  /**
+   * The stack trace associated with the generation of the error, used for
+   * debugging the server.
+   */
+  void set stackTrace(String value) {
+    assert(value != null);
+    this._stackTrace = value;
+  }
+
+  ServerErrorParams(bool isFatal, String message, String stackTrace) {
+    this.isFatal = isFatal;
+    this.message = message;
+    this.stackTrace = stackTrace;
+  }
 
   factory ServerErrorParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -397,19 +469,42 @@
  * }
  */
 class ServerStatusParams implements HasToJson {
+  AnalysisStatus _analysis;
+
+  PubStatus _pub;
+
   /**
    * The current status of analysis, including whether analysis is being
    * performed and if so what is being analyzed.
    */
-  AnalysisStatus analysis;
+  AnalysisStatus get analysis => _analysis;
+
+  /**
+   * The current status of analysis, including whether analysis is being
+   * performed and if so what is being analyzed.
+   */
+  void set analysis(AnalysisStatus value) {
+    this._analysis = value;
+  }
 
   /**
    * The current status of pub execution, indicating whether we are currently
    * running pub.
    */
-  PubStatus pub;
+  PubStatus get pub => _pub;
 
-  ServerStatusParams({this.analysis, this.pub});
+  /**
+   * The current status of pub execution, indicating whether we are currently
+   * running pub.
+   */
+  void set pub(PubStatus value) {
+    this._pub = value;
+  }
+
+  ServerStatusParams({AnalysisStatus analysis, PubStatus pub}) {
+    this.analysis = analysis;
+    this.pub = pub;
+  }
 
   factory ServerStatusParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -479,12 +574,24 @@
  * }
  */
 class AnalysisGetErrorsParams implements HasToJson {
+  String _file;
+
   /**
    * The file for which errors are being requested.
    */
-  String file;
+  String get file => _file;
 
-  AnalysisGetErrorsParams(this.file);
+  /**
+   * The file for which errors are being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
+
+  AnalysisGetErrorsParams(String file) {
+    this.file = file;
+  }
 
   factory AnalysisGetErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -545,12 +652,24 @@
  * }
  */
 class AnalysisGetErrorsResult implements HasToJson {
+  List<AnalysisError> _errors;
+
   /**
    * The errors associated with the file.
    */
-  List<AnalysisError> errors;
+  List<AnalysisError> get errors => _errors;
 
-  AnalysisGetErrorsResult(this.errors);
+  /**
+   * The errors associated with the file.
+   */
+  void set errors(List<AnalysisError> value) {
+    assert(value != null);
+    this._errors = value;
+  }
+
+  AnalysisGetErrorsResult(List<AnalysisError> errors) {
+    this.errors = errors;
+  }
 
   factory AnalysisGetErrorsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -612,17 +731,40 @@
  * }
  */
 class AnalysisGetHoverParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
   /**
    * The file in which hover information is being requested.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file in which hover information is being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset for which hover information is being requested.
    */
-  int offset;
+  int get offset => _offset;
 
-  AnalysisGetHoverParams(this.file, this.offset);
+  /**
+   * The offset for which hover information is being requested.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
+
+  AnalysisGetHoverParams(String file, int offset) {
+    this.file = file;
+    this.offset = offset;
+  }
 
   factory AnalysisGetHoverParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -692,6 +834,8 @@
  * }
  */
 class AnalysisGetHoverResult implements HasToJson {
+  List<HoverInformation> _hovers;
+
   /**
    * The hover information associated with the location. The list will be empty
    * if no information could be determined for the location. The list can
@@ -699,9 +843,23 @@
    * in conflicting ways (such as a part that is included in multiple
    * libraries).
    */
-  List<HoverInformation> hovers;
+  List<HoverInformation> get hovers => _hovers;
 
-  AnalysisGetHoverResult(this.hovers);
+  /**
+   * The hover information associated with the location. The list will be empty
+   * if no information could be determined for the location. The list can
+   * contain multiple items if the file is being analyzed in multiple contexts
+   * in conflicting ways (such as a part that is included in multiple
+   * libraries).
+   */
+  void set hovers(List<HoverInformation> value) {
+    assert(value != null);
+    this._hovers = value;
+  }
+
+  AnalysisGetHoverResult(List<HoverInformation> hovers) {
+    this.hovers = hovers;
+  }
 
   factory AnalysisGetHoverResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -784,19 +942,44 @@
  * }
  */
 class AnalysisGetLibraryDependenciesResult implements HasToJson {
+  List<String> _libraries;
+
+  Map<String, Map<String, List<String>>> _packageMap;
+
   /**
    * A list of the paths of library elements referenced by files in existing
    * analysis roots.
    */
-  List<String> libraries;
+  List<String> get libraries => _libraries;
+
+  /**
+   * A list of the paths of library elements referenced by files in existing
+   * analysis roots.
+   */
+  void set libraries(List<String> value) {
+    assert(value != null);
+    this._libraries = value;
+  }
 
   /**
    * A mapping from context source roots to package maps which map package
    * names to source directories for use in client-side package URI resolution.
    */
-  Map<String, Map<String, List<String>>> packageMap;
+  Map<String, Map<String, List<String>>> get packageMap => _packageMap;
 
-  AnalysisGetLibraryDependenciesResult(this.libraries, this.packageMap);
+  /**
+   * A mapping from context source roots to package maps which map package
+   * names to source directories for use in client-side package URI resolution.
+   */
+  void set packageMap(Map<String, Map<String, List<String>>> value) {
+    assert(value != null);
+    this._packageMap = value;
+  }
+
+  AnalysisGetLibraryDependenciesResult(List<String> libraries, Map<String, Map<String, List<String>>> packageMap) {
+    this.libraries = libraries;
+    this.packageMap = packageMap;
+  }
 
   factory AnalysisGetLibraryDependenciesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -868,24 +1051,60 @@
  * }
  */
 class AnalysisGetNavigationParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  int _length;
+
   /**
    * The file in which navigation information is being requested.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file in which navigation information is being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the region for which navigation information is being
    * requested.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region for which navigation information is being
+   * requested.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region for which navigation information is being
    * requested.
    */
-  int length;
+  int get length => _length;
 
-  AnalysisGetNavigationParams(this.file, this.offset, this.length);
+  /**
+   * The length of the region for which navigation information is being
+   * requested.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  AnalysisGetNavigationParams(String file, int offset, int length) {
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+  }
 
   factory AnalysisGetNavigationParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -966,24 +1185,60 @@
  * }
  */
 class AnalysisGetNavigationResult implements HasToJson {
+  List<String> _files;
+
+  List<NavigationTarget> _targets;
+
+  List<NavigationRegion> _regions;
+
   /**
    * A list of the paths of files that are referenced by the navigation
    * targets.
    */
-  List<String> files;
+  List<String> get files => _files;
+
+  /**
+   * A list of the paths of files that are referenced by the navigation
+   * targets.
+   */
+  void set files(List<String> value) {
+    assert(value != null);
+    this._files = value;
+  }
 
   /**
    * A list of the navigation targets that are referenced by the navigation
    * regions.
    */
-  List<NavigationTarget> targets;
+  List<NavigationTarget> get targets => _targets;
+
+  /**
+   * A list of the navigation targets that are referenced by the navigation
+   * regions.
+   */
+  void set targets(List<NavigationTarget> value) {
+    assert(value != null);
+    this._targets = value;
+  }
 
   /**
    * A list of the navigation regions within the requested region of the file.
    */
-  List<NavigationRegion> regions;
+  List<NavigationRegion> get regions => _regions;
 
-  AnalysisGetNavigationResult(this.files, this.targets, this.regions);
+  /**
+   * A list of the navigation regions within the requested region of the file.
+   */
+  void set regions(List<NavigationRegion> value) {
+    assert(value != null);
+    this._regions = value;
+  }
+
+  AnalysisGetNavigationResult(List<String> files, List<NavigationTarget> targets, List<NavigationRegion> regions) {
+    this.files = files;
+    this.targets = targets;
+    this.regions = regions;
+  }
 
   factory AnalysisGetNavigationResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1062,12 +1317,23 @@
  * }
  */
 class AnalysisReanalyzeParams implements HasToJson {
+  List<String> _roots;
+
   /**
    * A list of the analysis roots that are to be re-analyzed.
    */
-  List<String> roots;
+  List<String> get roots => _roots;
 
-  AnalysisReanalyzeParams({this.roots});
+  /**
+   * A list of the analysis roots that are to be re-analyzed.
+   */
+  void set roots(List<String> value) {
+    this._roots = value;
+  }
+
+  AnalysisReanalyzeParams({List<String> roots}) {
+    this.roots = roots;
+  }
 
   factory AnalysisReanalyzeParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1151,16 +1417,39 @@
  * }
  */
 class AnalysisSetAnalysisRootsParams implements HasToJson {
+  List<String> _included;
+
+  List<String> _excluded;
+
+  Map<String, String> _packageRoots;
+
   /**
    * A list of the files and directories that should be analyzed.
    */
-  List<String> included;
+  List<String> get included => _included;
+
+  /**
+   * A list of the files and directories that should be analyzed.
+   */
+  void set included(List<String> value) {
+    assert(value != null);
+    this._included = value;
+  }
 
   /**
    * A list of the files and directories within the included directories that
    * should not be analyzed.
    */
-  List<String> excluded;
+  List<String> get excluded => _excluded;
+
+  /**
+   * A list of the files and directories within the included directories that
+   * should not be analyzed.
+   */
+  void set excluded(List<String> value) {
+    assert(value != null);
+    this._excluded = value;
+  }
 
   /**
    * A mapping from source directories to target directories that should
@@ -1176,9 +1465,31 @@
    * this field is absent, or the empty map is specified, that indicates that
    * the normal pubspec.yaml mechanism should always be used.
    */
-  Map<String, String> packageRoots;
+  Map<String, String> get packageRoots => _packageRoots;
 
-  AnalysisSetAnalysisRootsParams(this.included, this.excluded, {this.packageRoots});
+  /**
+   * A mapping from source directories to target directories that should
+   * override the normal package: URI resolution mechanism. The analyzer will
+   * behave as though each source directory in the map contains a special
+   * pubspec.yaml file which resolves any package: URI to the corresponding
+   * path within the target directory. The effect is the same as specifying the
+   * target directory as a "--package_root" parameter to the Dart VM when
+   * executing any Dart file inside the source directory.
+   *
+   * Files in any directories that are not overridden by this mapping have
+   * their package: URI's resolved using the normal pubspec.yaml mechanism. If
+   * this field is absent, or the empty map is specified, that indicates that
+   * the normal pubspec.yaml mechanism should always be used.
+   */
+  void set packageRoots(Map<String, String> value) {
+    this._packageRoots = value;
+  }
+
+  AnalysisSetAnalysisRootsParams(List<String> included, List<String> excluded, {Map<String, String> packageRoots}) {
+    this.included = included;
+    this.excluded = excluded;
+    this.packageRoots = packageRoots;
+  }
 
   factory AnalysisSetAnalysisRootsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1278,12 +1589,24 @@
  * }
  */
 class AnalysisSetPriorityFilesParams implements HasToJson {
+  List<String> _files;
+
   /**
    * The files that are to be a priority for analysis.
    */
-  List<String> files;
+  List<String> get files => _files;
 
-  AnalysisSetPriorityFilesParams(this.files);
+  /**
+   * The files that are to be a priority for analysis.
+   */
+  void set files(List<String> value) {
+    assert(value != null);
+    this._files = value;
+  }
+
+  AnalysisSetPriorityFilesParams(List<String> files) {
+    this.files = files;
+  }
 
   factory AnalysisSetPriorityFilesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1365,13 +1688,26 @@
  * }
  */
 class AnalysisSetSubscriptionsParams implements HasToJson {
+  Map<AnalysisService, List<String>> _subscriptions;
+
   /**
    * A table mapping services to a list of the files being subscribed to the
    * service.
    */
-  Map<AnalysisService, List<String>> subscriptions;
+  Map<AnalysisService, List<String>> get subscriptions => _subscriptions;
 
-  AnalysisSetSubscriptionsParams(this.subscriptions);
+  /**
+   * A table mapping services to a list of the files being subscribed to the
+   * service.
+   */
+  void set subscriptions(Map<AnalysisService, List<String>> value) {
+    assert(value != null);
+    this._subscriptions = value;
+  }
+
+  AnalysisSetSubscriptionsParams(Map<AnalysisService, List<String>> subscriptions) {
+    this.subscriptions = subscriptions;
+  }
 
   factory AnalysisSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1453,13 +1789,26 @@
  * }
  */
 class AnalysisUpdateContentParams implements HasToJson {
+  Map<String, dynamic> _files;
+
   /**
    * A table mapping the files whose content has changed to a description of
    * the content change.
    */
-  Map<String, dynamic> files;
+  Map<String, dynamic> get files => _files;
 
-  AnalysisUpdateContentParams(this.files);
+  /**
+   * A table mapping the files whose content has changed to a description of
+   * the content change.
+   */
+  void set files(Map<String, dynamic> value) {
+    assert(value != null);
+    this._files = value;
+  }
+
+  AnalysisUpdateContentParams(Map<String, dynamic> files) {
+    this.files = files;
+  }
 
   factory AnalysisUpdateContentParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1572,12 +1921,24 @@
  * }
  */
 class AnalysisUpdateOptionsParams implements HasToJson {
+  AnalysisOptions _options;
+
   /**
    * The options that are to be used to control analysis.
    */
-  AnalysisOptions options;
+  AnalysisOptions get options => _options;
 
-  AnalysisUpdateOptionsParams(this.options);
+  /**
+   * The options that are to be used to control analysis.
+   */
+  void set options(AnalysisOptions value) {
+    assert(value != null);
+    this._options = value;
+  }
+
+  AnalysisUpdateOptionsParams(AnalysisOptions options) {
+    this.options = options;
+  }
 
   factory AnalysisUpdateOptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1660,17 +2021,40 @@
  * }
  */
 class AnalysisErrorsParams implements HasToJson {
+  String _file;
+
+  List<AnalysisError> _errors;
+
   /**
    * The file containing the errors.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the errors.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The errors contained in the file.
    */
-  List<AnalysisError> errors;
+  List<AnalysisError> get errors => _errors;
 
-  AnalysisErrorsParams(this.file, this.errors);
+  /**
+   * The errors contained in the file.
+   */
+  void set errors(List<AnalysisError> value) {
+    assert(value != null);
+    this._errors = value;
+  }
+
+  AnalysisErrorsParams(String file, List<AnalysisError> errors) {
+    this.file = file;
+    this.errors = errors;
+  }
 
   factory AnalysisErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1740,12 +2124,24 @@
  * }
  */
 class AnalysisFlushResultsParams implements HasToJson {
+  List<String> _files;
+
   /**
    * The files that are no longer being analyzed.
    */
-  List<String> files;
+  List<String> get files => _files;
 
-  AnalysisFlushResultsParams(this.files);
+  /**
+   * The files that are no longer being analyzed.
+   */
+  void set files(List<String> value) {
+    assert(value != null);
+    this._files = value;
+  }
+
+  AnalysisFlushResultsParams(List<String> files) {
+    this.files = files;
+  }
 
   factory AnalysisFlushResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1807,17 +2203,40 @@
  * }
  */
 class AnalysisFoldingParams implements HasToJson {
+  String _file;
+
+  List<FoldingRegion> _regions;
+
   /**
    * The file containing the folding regions.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the folding regions.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The folding regions contained in the file.
    */
-  List<FoldingRegion> regions;
+  List<FoldingRegion> get regions => _regions;
 
-  AnalysisFoldingParams(this.file, this.regions);
+  /**
+   * The folding regions contained in the file.
+   */
+  void set regions(List<FoldingRegion> value) {
+    assert(value != null);
+    this._regions = value;
+  }
+
+  AnalysisFoldingParams(String file, List<FoldingRegion> regions) {
+    this.file = file;
+    this.regions = regions;
+  }
 
   factory AnalysisFoldingParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1888,10 +2307,22 @@
  * }
  */
 class AnalysisHighlightsParams implements HasToJson {
+  String _file;
+
+  List<HighlightRegion> _regions;
+
   /**
    * The file containing the highlight regions.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the highlight regions.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The highlight regions contained in the file. Each highlight region
@@ -1900,9 +2331,24 @@
    * highlight regions if there is more than one meaning associated with a
    * particular region.
    */
-  List<HighlightRegion> regions;
+  List<HighlightRegion> get regions => _regions;
 
-  AnalysisHighlightsParams(this.file, this.regions);
+  /**
+   * The highlight regions contained in the file. Each highlight region
+   * represents a particular syntactic or semantic meaning associated with some
+   * range. Note that the highlight regions that are returned can overlap other
+   * highlight regions if there is more than one meaning associated with a
+   * particular region.
+   */
+  void set regions(List<HighlightRegion> value) {
+    assert(value != null);
+    this._regions = value;
+  }
+
+  AnalysisHighlightsParams(String file, List<HighlightRegion> regions) {
+    this.file = file;
+    this.regions = regions;
+  }
 
   factory AnalysisHighlightsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1975,29 +2421,76 @@
  * }
  */
 class AnalysisInvalidateParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  int _length;
+
+  int _delta;
+
   /**
    * The file whose information has been invalidated.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file whose information has been invalidated.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the invalidated region.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the invalidated region.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the invalidated region.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the invalidated region.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The delta to be applied to the offsets in information that follows the
    * invalidated region in order to update it so that it doesn't need to be
    * re-requested.
    */
-  int delta;
+  int get delta => _delta;
 
-  AnalysisInvalidateParams(this.file, this.offset, this.length, this.delta);
+  /**
+   * The delta to be applied to the offsets in information that follows the
+   * invalidated region in order to update it so that it doesn't need to be
+   * re-requested.
+   */
+  void set delta(int value) {
+    assert(value != null);
+    this._delta = value;
+  }
+
+  AnalysisInvalidateParams(String file, int offset, int length, int delta) {
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+    this.delta = delta;
+  }
 
   factory AnalysisInvalidateParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2088,10 +2581,26 @@
  * }
  */
 class AnalysisNavigationParams implements HasToJson {
+  String _file;
+
+  List<NavigationRegion> _regions;
+
+  List<NavigationTarget> _targets;
+
+  List<String> _files;
+
   /**
    * The file containing the navigation regions.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the navigation regions.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The navigation regions contained in the file. The regions are sorted by
@@ -2102,21 +2611,58 @@
    * versions of a package. Note that the navigation regions that are returned
    * do not overlap other navigation regions.
    */
-  List<NavigationRegion> regions;
+  List<NavigationRegion> get regions => _regions;
+
+  /**
+   * The navigation regions contained in the file. The regions are sorted by
+   * their offsets. Each navigation region represents a list of targets
+   * associated with some range. The lists will usually contain a single
+   * target, but can contain more in the case of a part that is included in
+   * multiple libraries or in Dart code that is compiled against multiple
+   * versions of a package. Note that the navigation regions that are returned
+   * do not overlap other navigation regions.
+   */
+  void set regions(List<NavigationRegion> value) {
+    assert(value != null);
+    this._regions = value;
+  }
 
   /**
    * The navigation targets referenced in the file. They are referenced by
    * NavigationRegions by their index in this array.
    */
-  List<NavigationTarget> targets;
+  List<NavigationTarget> get targets => _targets;
+
+  /**
+   * The navigation targets referenced in the file. They are referenced by
+   * NavigationRegions by their index in this array.
+   */
+  void set targets(List<NavigationTarget> value) {
+    assert(value != null);
+    this._targets = value;
+  }
 
   /**
    * The files containing navigation targets referenced in the file. They are
    * referenced by NavigationTargets by their index in this array.
    */
-  List<String> files;
+  List<String> get files => _files;
 
-  AnalysisNavigationParams(this.file, this.regions, this.targets, this.files);
+  /**
+   * The files containing navigation targets referenced in the file. They are
+   * referenced by NavigationTargets by their index in this array.
+   */
+  void set files(List<String> value) {
+    assert(value != null);
+    this._files = value;
+  }
+
+  AnalysisNavigationParams(String file, List<NavigationRegion> regions, List<NavigationTarget> targets, List<String> files) {
+    this.file = file;
+    this.regions = regions;
+    this.targets = targets;
+    this.files = files;
+  }
 
   factory AnalysisNavigationParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2205,17 +2751,40 @@
  * }
  */
 class AnalysisOccurrencesParams implements HasToJson {
+  String _file;
+
+  List<Occurrences> _occurrences;
+
   /**
    * The file in which the references occur.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file in which the references occur.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The occurrences of references to elements within the file.
    */
-  List<Occurrences> occurrences;
+  List<Occurrences> get occurrences => _occurrences;
 
-  AnalysisOccurrencesParams(this.file, this.occurrences);
+  /**
+   * The occurrences of references to elements within the file.
+   */
+  void set occurrences(List<Occurrences> value) {
+    assert(value != null);
+    this._occurrences = value;
+  }
+
+  AnalysisOccurrencesParams(String file, List<Occurrences> occurrences) {
+    this.file = file;
+    this.occurrences = occurrences;
+  }
 
   factory AnalysisOccurrencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2286,17 +2855,40 @@
  * }
  */
 class AnalysisOutlineParams implements HasToJson {
+  String _file;
+
+  Outline _outline;
+
   /**
    * The file with which the outline is associated.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file with which the outline is associated.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The outline associated with the file.
    */
-  Outline outline;
+  Outline get outline => _outline;
 
-  AnalysisOutlineParams(this.file, this.outline);
+  /**
+   * The outline associated with the file.
+   */
+  void set outline(Outline value) {
+    assert(value != null);
+    this._outline = value;
+  }
+
+  AnalysisOutlineParams(String file, Outline outline) {
+    this.file = file;
+    this.outline = outline;
+  }
 
   factory AnalysisOutlineParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2367,17 +2959,40 @@
  * }
  */
 class AnalysisOverridesParams implements HasToJson {
+  String _file;
+
+  List<Override> _overrides;
+
   /**
    * The file with which the overrides are associated.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file with which the overrides are associated.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The overrides associated with the file.
    */
-  List<Override> overrides;
+  List<Override> get overrides => _overrides;
 
-  AnalysisOverridesParams(this.file, this.overrides);
+  /**
+   * The overrides associated with the file.
+   */
+  void set overrides(List<Override> value) {
+    assert(value != null);
+    this._overrides = value;
+  }
+
+  AnalysisOverridesParams(String file, List<Override> overrides) {
+    this.file = file;
+    this.overrides = overrides;
+  }
 
   factory AnalysisOverridesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2448,17 +3063,40 @@
  * }
  */
 class CompletionGetSuggestionsParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
   /**
    * The file containing the point at which suggestions are to be made.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the point at which suggestions are to be made.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset within the file at which suggestions are to be made.
    */
-  int offset;
+  int get offset => _offset;
 
-  CompletionGetSuggestionsParams(this.file, this.offset);
+  /**
+   * The offset within the file at which suggestions are to be made.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
+
+  CompletionGetSuggestionsParams(String file, int offset) {
+    this.file = file;
+    this.offset = offset;
+  }
 
   factory CompletionGetSuggestionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2528,12 +3166,24 @@
  * }
  */
 class CompletionGetSuggestionsResult implements HasToJson {
+  String _id;
+
   /**
    * The identifier used to associate results with this completion request.
    */
-  String id;
+  String get id => _id;
 
-  CompletionGetSuggestionsResult(this.id);
+  /**
+   * The identifier used to associate results with this completion request.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  CompletionGetSuggestionsResult(String id) {
+    this.id = id;
+  }
 
   factory CompletionGetSuggestionsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2598,10 +3248,28 @@
  * }
  */
 class CompletionResultsParams implements HasToJson {
+  String _id;
+
+  int _replacementOffset;
+
+  int _replacementLength;
+
+  List<CompletionSuggestion> _results;
+
+  bool _isLast;
+
   /**
    * The id associated with the completion.
    */
-  String id;
+  String get id => _id;
+
+  /**
+   * The id associated with the completion.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
 
   /**
    * The offset of the start of the text to be replaced. This will be different
@@ -2609,14 +3277,35 @@
    * portion of an identifier before the original offset. In particular, the
    * replacementOffset will be the offset of the beginning of said identifier.
    */
-  int replacementOffset;
+  int get replacementOffset => _replacementOffset;
+
+  /**
+   * The offset of the start of the text to be replaced. This will be different
+   * than the offset used to request the completion suggestions if there was a
+   * portion of an identifier before the original offset. In particular, the
+   * replacementOffset will be the offset of the beginning of said identifier.
+   */
+  void set replacementOffset(int value) {
+    assert(value != null);
+    this._replacementOffset = value;
+  }
 
   /**
    * The length of the text to be replaced if the remainder of the identifier
    * containing the cursor is to be replaced when the suggestion is applied
    * (that is, the number of characters in the existing identifier).
    */
-  int replacementLength;
+  int get replacementLength => _replacementLength;
+
+  /**
+   * The length of the text to be replaced if the remainder of the identifier
+   * containing the cursor is to be replaced when the suggestion is applied
+   * (that is, the number of characters in the existing identifier).
+   */
+  void set replacementLength(int value) {
+    assert(value != null);
+    this._replacementLength = value;
+  }
 
   /**
    * The completion suggestions being reported. The notification contains all
@@ -2625,15 +3314,42 @@
    * client to respond to further keystrokes from the user without having to
    * make additional requests.
    */
-  List<CompletionSuggestion> results;
+  List<CompletionSuggestion> get results => _results;
+
+  /**
+   * The completion suggestions being reported. The notification contains all
+   * possible completions at the requested cursor position, even those that do
+   * not match the characters the user has already typed. This allows the
+   * client to respond to further keystrokes from the user without having to
+   * make additional requests.
+   */
+  void set results(List<CompletionSuggestion> value) {
+    assert(value != null);
+    this._results = value;
+  }
 
   /**
    * True if this is that last set of results that will be returned for the
    * indicated completion.
    */
-  bool isLast;
+  bool get isLast => _isLast;
 
-  CompletionResultsParams(this.id, this.replacementOffset, this.replacementLength, this.results, this.isLast);
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated completion.
+   */
+  void set isLast(bool value) {
+    assert(value != null);
+    this._isLast = value;
+  }
+
+  CompletionResultsParams(String id, int replacementOffset, int replacementLength, List<CompletionSuggestion> results, bool isLast) {
+    this.id = id;
+    this.replacementOffset = replacementOffset;
+    this.replacementLength = replacementLength;
+    this.results = results;
+    this.isLast = isLast;
+  }
 
   factory CompletionResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2732,24 +3448,60 @@
  * }
  */
 class SearchFindElementReferencesParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  bool _includePotential;
+
   /**
    * The file containing the declaration of or reference to the element used to
    * define the search.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the declaration of or reference to the element used to
+   * define the search.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset within the file of the declaration of or reference to the
    * element.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset within the file of the declaration of or reference to the
+   * element.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * True if potential matches are to be included in the results.
    */
-  bool includePotential;
+  bool get includePotential => _includePotential;
 
-  SearchFindElementReferencesParams(this.file, this.offset, this.includePotential);
+  /**
+   * True if potential matches are to be included in the results.
+   */
+  void set includePotential(bool value) {
+    assert(value != null);
+    this._includePotential = value;
+  }
+
+  SearchFindElementReferencesParams(String file, int offset, bool includePotential) {
+    this.file = file;
+    this.offset = offset;
+    this.includePotential = includePotential;
+  }
 
   factory SearchFindElementReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2829,13 +3581,27 @@
  * }
  */
 class SearchFindElementReferencesResult implements HasToJson {
+  String _id;
+
+  Element _element;
+
   /**
    * The identifier used to associate results with this search request.
    *
    * If no element was found at the given location, this field will be absent,
    * and no results will be reported via the search.results notification.
    */
-  String id;
+  String get id => _id;
+
+  /**
+   * The identifier used to associate results with this search request.
+   *
+   * If no element was found at the given location, this field will be absent,
+   * and no results will be reported via the search.results notification.
+   */
+  void set id(String value) {
+    this._id = value;
+  }
 
   /**
    * The element referenced or defined at the given offset and whose references
@@ -2843,9 +3609,22 @@
    *
    * If no element was found at the given location, this field will be absent.
    */
-  Element element;
+  Element get element => _element;
 
-  SearchFindElementReferencesResult({this.id, this.element});
+  /**
+   * The element referenced or defined at the given offset and whose references
+   * will be returned in the search results.
+   *
+   * If no element was found at the given location, this field will be absent.
+   */
+  void set element(Element value) {
+    this._element = value;
+  }
+
+  SearchFindElementReferencesResult({String id, Element element}) {
+    this.id = id;
+    this.element = element;
+  }
 
   factory SearchFindElementReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2915,12 +3694,24 @@
  * }
  */
 class SearchFindMemberDeclarationsParams implements HasToJson {
+  String _name;
+
   /**
    * The name of the declarations to be found.
    */
-  String name;
+  String get name => _name;
 
-  SearchFindMemberDeclarationsParams(this.name);
+  /**
+   * The name of the declarations to be found.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  SearchFindMemberDeclarationsParams(String name) {
+    this.name = name;
+  }
 
   factory SearchFindMemberDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -2981,12 +3772,24 @@
  * }
  */
 class SearchFindMemberDeclarationsResult implements HasToJson {
+  String _id;
+
   /**
    * The identifier used to associate results with this search request.
    */
-  String id;
+  String get id => _id;
 
-  SearchFindMemberDeclarationsResult(this.id);
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  SearchFindMemberDeclarationsResult(String id) {
+    this.id = id;
+  }
 
   factory SearchFindMemberDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3047,12 +3850,24 @@
  * }
  */
 class SearchFindMemberReferencesParams implements HasToJson {
+  String _name;
+
   /**
    * The name of the references to be found.
    */
-  String name;
+  String get name => _name;
 
-  SearchFindMemberReferencesParams(this.name);
+  /**
+   * The name of the references to be found.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  SearchFindMemberReferencesParams(String name) {
+    this.name = name;
+  }
 
   factory SearchFindMemberReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3113,12 +3928,24 @@
  * }
  */
 class SearchFindMemberReferencesResult implements HasToJson {
+  String _id;
+
   /**
    * The identifier used to associate results with this search request.
    */
-  String id;
+  String get id => _id;
 
-  SearchFindMemberReferencesResult(this.id);
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  SearchFindMemberReferencesResult(String id) {
+    this.id = id;
+  }
 
   factory SearchFindMemberReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3179,13 +4006,26 @@
  * }
  */
 class SearchFindTopLevelDeclarationsParams implements HasToJson {
+  String _pattern;
+
   /**
    * The regular expression used to match the names of the declarations to be
    * found.
    */
-  String pattern;
+  String get pattern => _pattern;
 
-  SearchFindTopLevelDeclarationsParams(this.pattern);
+  /**
+   * The regular expression used to match the names of the declarations to be
+   * found.
+   */
+  void set pattern(String value) {
+    assert(value != null);
+    this._pattern = value;
+  }
+
+  SearchFindTopLevelDeclarationsParams(String pattern) {
+    this.pattern = pattern;
+  }
 
   factory SearchFindTopLevelDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3246,12 +4086,24 @@
  * }
  */
 class SearchFindTopLevelDeclarationsResult implements HasToJson {
+  String _id;
+
   /**
    * The identifier used to associate results with this search request.
    */
-  String id;
+  String get id => _id;
 
-  SearchFindTopLevelDeclarationsResult(this.id);
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  SearchFindTopLevelDeclarationsResult(String id) {
+    this.id = id;
+  }
 
   factory SearchFindTopLevelDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3313,18 +4165,42 @@
  * }
  */
 class SearchGetTypeHierarchyParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
   /**
    * The file containing the declaration or reference to the type for which a
    * hierarchy is being requested.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the declaration or reference to the type for which a
+   * hierarchy is being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the name of the type within the file.
    */
-  int offset;
+  int get offset => _offset;
 
-  SearchGetTypeHierarchyParams(this.file, this.offset);
+  /**
+   * The offset of the name of the type within the file.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
+
+  SearchGetTypeHierarchyParams(String file, int offset) {
+    this.file = file;
+    this.offset = offset;
+  }
 
   factory SearchGetTypeHierarchyParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3394,6 +4270,8 @@
  * }
  */
 class SearchGetTypeHierarchyResult implements HasToJson {
+  List<TypeHierarchyItem> _hierarchyItems;
+
   /**
    * A list of the types in the requested hierarchy. The first element of the
    * list is the item representing the type for which the hierarchy was
@@ -3405,9 +4283,26 @@
    * not represent a type, or if the file has not been sufficiently analyzed to
    * allow a type hierarchy to be produced.
    */
-  List<TypeHierarchyItem> hierarchyItems;
+  List<TypeHierarchyItem> get hierarchyItems => _hierarchyItems;
 
-  SearchGetTypeHierarchyResult({this.hierarchyItems});
+  /**
+   * A list of the types in the requested hierarchy. The first element of the
+   * list is the item representing the type for which the hierarchy was
+   * requested. The index of other elements of the list is unspecified, but
+   * correspond to the integers used to reference supertype and subtype items
+   * within the items.
+   *
+   * This field will be absent if the code at the given file and offset does
+   * not represent a type, or if the file has not been sufficiently analyzed to
+   * allow a type hierarchy to be produced.
+   */
+  void set hierarchyItems(List<TypeHierarchyItem> value) {
+    this._hierarchyItems = value;
+  }
+
+  SearchGetTypeHierarchyResult({List<TypeHierarchyItem> hierarchyItems}) {
+    this.hierarchyItems = hierarchyItems;
+  }
 
   factory SearchGetTypeHierarchyResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3470,23 +4365,58 @@
  * }
  */
 class SearchResultsParams implements HasToJson {
+  String _id;
+
+  List<SearchResult> _results;
+
+  bool _isLast;
+
   /**
    * The id associated with the search.
    */
-  String id;
+  String get id => _id;
+
+  /**
+   * The id associated with the search.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
 
   /**
    * The search results being reported.
    */
-  List<SearchResult> results;
+  List<SearchResult> get results => _results;
+
+  /**
+   * The search results being reported.
+   */
+  void set results(List<SearchResult> value) {
+    assert(value != null);
+    this._results = value;
+  }
 
   /**
    * True if this is that last set of results that will be returned for the
    * indicated search.
    */
-  bool isLast;
+  bool get isLast => _isLast;
 
-  SearchResultsParams(this.id, this.results, this.isLast);
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated search.
+   */
+  void set isLast(bool value) {
+    assert(value != null);
+    this._isLast = value;
+  }
+
+  SearchResultsParams(String id, List<SearchResult> results, bool isLast) {
+    this.id = id;
+    this.results = results;
+    this.isLast = isLast;
+  }
 
   factory SearchResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3567,22 +4497,56 @@
  * }
  */
 class EditFormatParams implements HasToJson {
+  String _file;
+
+  int _selectionOffset;
+
+  int _selectionLength;
+
   /**
    * The file containing the code to be formatted.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the code to be formatted.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the current selection in the file.
    */
-  int selectionOffset;
+  int get selectionOffset => _selectionOffset;
+
+  /**
+   * The offset of the current selection in the file.
+   */
+  void set selectionOffset(int value) {
+    assert(value != null);
+    this._selectionOffset = value;
+  }
 
   /**
    * The length of the current selection in the file.
    */
-  int selectionLength;
+  int get selectionLength => _selectionLength;
 
-  EditFormatParams(this.file, this.selectionOffset, this.selectionLength);
+  /**
+   * The length of the current selection in the file.
+   */
+  void set selectionLength(int value) {
+    assert(value != null);
+    this._selectionLength = value;
+  }
+
+  EditFormatParams(String file, int selectionOffset, int selectionLength) {
+    this.file = file;
+    this.selectionOffset = selectionOffset;
+    this.selectionLength = selectionLength;
+  }
 
   factory EditFormatParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3663,23 +4627,58 @@
  * }
  */
 class EditFormatResult implements HasToJson {
+  List<SourceEdit> _edits;
+
+  int _selectionOffset;
+
+  int _selectionLength;
+
   /**
    * The edit(s) to be applied in order to format the code. The list will be
    * empty if the code was already formatted (there are no changes).
    */
-  List<SourceEdit> edits;
+  List<SourceEdit> get edits => _edits;
+
+  /**
+   * The edit(s) to be applied in order to format the code. The list will be
+   * empty if the code was already formatted (there are no changes).
+   */
+  void set edits(List<SourceEdit> value) {
+    assert(value != null);
+    this._edits = value;
+  }
 
   /**
    * The offset of the selection after formatting the code.
    */
-  int selectionOffset;
+  int get selectionOffset => _selectionOffset;
+
+  /**
+   * The offset of the selection after formatting the code.
+   */
+  void set selectionOffset(int value) {
+    assert(value != null);
+    this._selectionOffset = value;
+  }
 
   /**
    * The length of the selection after formatting the code.
    */
-  int selectionLength;
+  int get selectionLength => _selectionLength;
 
-  EditFormatResult(this.edits, this.selectionOffset, this.selectionLength);
+  /**
+   * The length of the selection after formatting the code.
+   */
+  void set selectionLength(int value) {
+    assert(value != null);
+    this._selectionLength = value;
+  }
+
+  EditFormatResult(List<SourceEdit> edits, int selectionOffset, int selectionLength) {
+    this.edits = edits;
+    this.selectionOffset = selectionOffset;
+    this.selectionLength = selectionLength;
+  }
 
   factory EditFormatResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3760,22 +4759,56 @@
  * }
  */
 class EditGetAssistsParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  int _length;
+
   /**
    * The file containing the code for which assists are being requested.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the code for which assists are being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the code for which assists are being requested.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the code for which assists are being requested.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the code for which assists are being requested.
    */
-  int length;
+  int get length => _length;
 
-  EditGetAssistsParams(this.file, this.offset, this.length);
+  /**
+   * The length of the code for which assists are being requested.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  EditGetAssistsParams(String file, int offset, int length) {
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+  }
 
   factory EditGetAssistsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3854,12 +4887,24 @@
  * }
  */
 class EditGetAssistsResult implements HasToJson {
+  List<SourceChange> _assists;
+
   /**
    * The assists that are available at the given location.
    */
-  List<SourceChange> assists;
+  List<SourceChange> get assists => _assists;
 
-  EditGetAssistsResult(this.assists);
+  /**
+   * The assists that are available at the given location.
+   */
+  void set assists(List<SourceChange> value) {
+    assert(value != null);
+    this._assists = value;
+  }
+
+  EditGetAssistsResult(List<SourceChange> assists) {
+    this.assists = assists;
+  }
 
   factory EditGetAssistsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -3922,22 +4967,56 @@
  * }
  */
 class EditGetAvailableRefactoringsParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  int _length;
+
   /**
    * The file containing the code on which the refactoring would be based.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the code on which the refactoring would be based.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the code on which the refactoring would be based.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the code on which the refactoring would be based.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the code on which the refactoring would be based.
    */
-  int length;
+  int get length => _length;
 
-  EditGetAvailableRefactoringsParams(this.file, this.offset, this.length);
+  /**
+   * The length of the code on which the refactoring would be based.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  EditGetAvailableRefactoringsParams(String file, int offset, int length) {
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+  }
 
   factory EditGetAvailableRefactoringsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4016,12 +5095,24 @@
  * }
  */
 class EditGetAvailableRefactoringsResult implements HasToJson {
+  List<RefactoringKind> _kinds;
+
   /**
    * The kinds of refactorings that are valid for the given selection.
    */
-  List<RefactoringKind> kinds;
+  List<RefactoringKind> get kinds => _kinds;
 
-  EditGetAvailableRefactoringsResult(this.kinds);
+  /**
+   * The kinds of refactorings that are valid for the given selection.
+   */
+  void set kinds(List<RefactoringKind> value) {
+    assert(value != null);
+    this._kinds = value;
+  }
+
+  EditGetAvailableRefactoringsResult(List<RefactoringKind> kinds) {
+    this.kinds = kinds;
+  }
 
   factory EditGetAvailableRefactoringsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4083,17 +5174,40 @@
  * }
  */
 class EditGetFixesParams implements HasToJson {
+  String _file;
+
+  int _offset;
+
   /**
    * The file containing the errors for which fixes are being requested.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the errors for which fixes are being requested.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset used to select the errors for which fixes will be returned.
    */
-  int offset;
+  int get offset => _offset;
 
-  EditGetFixesParams(this.file, this.offset);
+  /**
+   * The offset used to select the errors for which fixes will be returned.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
+
+  EditGetFixesParams(String file, int offset) {
+    this.file = file;
+    this.offset = offset;
+  }
 
   factory EditGetFixesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4163,12 +5277,24 @@
  * }
  */
 class EditGetFixesResult implements HasToJson {
+  List<AnalysisErrorFixes> _fixes;
+
   /**
    * The fixes that are available for the errors at the given offset.
    */
-  List<AnalysisErrorFixes> fixes;
+  List<AnalysisErrorFixes> get fixes => _fixes;
 
-  EditGetFixesResult(this.fixes);
+  /**
+   * The fixes that are available for the errors at the given offset.
+   */
+  void set fixes(List<AnalysisErrorFixes> value) {
+    assert(value != null);
+    this._fixes = value;
+  }
+
+  EditGetFixesResult(List<AnalysisErrorFixes> fixes) {
+    this.fixes = fixes;
+  }
 
   factory EditGetFixesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4234,31 +5360,84 @@
  * }
  */
 class EditGetRefactoringParams implements HasToJson {
+  RefactoringKind _kind;
+
+  String _file;
+
+  int _offset;
+
+  int _length;
+
+  bool _validateOnly;
+
+  RefactoringOptions _options;
+
   /**
    * The kind of refactoring to be performed.
    */
-  RefactoringKind kind;
+  RefactoringKind get kind => _kind;
+
+  /**
+   * The kind of refactoring to be performed.
+   */
+  void set kind(RefactoringKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The file containing the code involved in the refactoring.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the code involved in the refactoring.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the region involved in the refactoring.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region involved in the refactoring.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region involved in the refactoring.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the region involved in the refactoring.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * True if the client is only requesting that the values of the options be
    * validated and no change be generated.
    */
-  bool validateOnly;
+  bool get validateOnly => _validateOnly;
+
+  /**
+   * True if the client is only requesting that the values of the options be
+   * validated and no change be generated.
+   */
+  void set validateOnly(bool value) {
+    assert(value != null);
+    this._validateOnly = value;
+  }
 
   /**
    * Data used to provide values provided by the user. The structure of the
@@ -4267,9 +5446,27 @@
    * as “Options”. This field can be omitted if the refactoring does not
    * require any options or if the values of those options are not known.
    */
-  RefactoringOptions options;
+  RefactoringOptions get options => _options;
 
-  EditGetRefactoringParams(this.kind, this.file, this.offset, this.length, this.validateOnly, {this.options});
+  /**
+   * Data used to provide values provided by the user. The structure of the
+   * data is dependent on the kind of refactoring being performed. The data
+   * that is expected is documented in the section titled Refactorings, labeled
+   * as “Options”. This field can be omitted if the refactoring does not
+   * require any options or if the values of those options are not known.
+   */
+  void set options(RefactoringOptions value) {
+    this._options = value;
+  }
+
+  EditGetRefactoringParams(RefactoringKind kind, String file, int offset, int length, bool validateOnly, {RefactoringOptions options}) {
+    this.kind = kind;
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+    this.validateOnly = validateOnly;
+    this.options = options;
+  }
 
   factory EditGetRefactoringParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4382,26 +5579,68 @@
  * }
  */
 class EditGetRefactoringResult implements HasToJson {
+  List<RefactoringProblem> _initialProblems;
+
+  List<RefactoringProblem> _optionsProblems;
+
+  List<RefactoringProblem> _finalProblems;
+
+  RefactoringFeedback _feedback;
+
+  SourceChange _change;
+
+  List<String> _potentialEdits;
+
   /**
    * The initial status of the refactoring, i.e. problems related to the
    * context in which the refactoring is requested. The array will be empty if
    * there are no known problems.
    */
-  List<RefactoringProblem> initialProblems;
+  List<RefactoringProblem> get initialProblems => _initialProblems;
+
+  /**
+   * The initial status of the refactoring, i.e. problems related to the
+   * context in which the refactoring is requested. The array will be empty if
+   * there are no known problems.
+   */
+  void set initialProblems(List<RefactoringProblem> value) {
+    assert(value != null);
+    this._initialProblems = value;
+  }
 
   /**
    * The options validation status, i.e. problems in the given options, such as
    * light-weight validation of a new name, flags compatibility, etc. The array
    * will be empty if there are no known problems.
    */
-  List<RefactoringProblem> optionsProblems;
+  List<RefactoringProblem> get optionsProblems => _optionsProblems;
+
+  /**
+   * The options validation status, i.e. problems in the given options, such as
+   * light-weight validation of a new name, flags compatibility, etc. The array
+   * will be empty if there are no known problems.
+   */
+  void set optionsProblems(List<RefactoringProblem> value) {
+    assert(value != null);
+    this._optionsProblems = value;
+  }
 
   /**
    * The final status of the refactoring, i.e. problems identified in the
    * result of a full, potentially expensive validation and / or change
    * creation. The array will be empty if there are no known problems.
    */
-  List<RefactoringProblem> finalProblems;
+  List<RefactoringProblem> get finalProblems => _finalProblems;
+
+  /**
+   * The final status of the refactoring, i.e. problems identified in the
+   * result of a full, potentially expensive validation and / or change
+   * creation. The array will be empty if there are no known problems.
+   */
+  void set finalProblems(List<RefactoringProblem> value) {
+    assert(value != null);
+    this._finalProblems = value;
+  }
 
   /**
    * Data used to provide feedback to the user. The structure of the data is
@@ -4409,7 +5648,17 @@
    * returned is documented in the section titled Refactorings, labeled as
    * “Feedback”.
    */
-  RefactoringFeedback feedback;
+  RefactoringFeedback get feedback => _feedback;
+
+  /**
+   * Data used to provide feedback to the user. The structure of the data is
+   * dependent on the kind of refactoring being created. The data that is
+   * returned is documented in the section titled Refactorings, labeled as
+   * “Feedback”.
+   */
+  void set feedback(RefactoringFeedback value) {
+    this._feedback = value;
+  }
 
   /**
    * The changes that are to be applied to affect the refactoring. This field
@@ -4417,7 +5666,17 @@
    * being computed, such as having no options specified for a refactoring that
    * requires them, or if only validation was requested.
    */
-  SourceChange change;
+  SourceChange get change => _change;
+
+  /**
+   * The changes that are to be applied to affect the refactoring. This field
+   * will be omitted if there are problems that prevent a set of changes from
+   * being computed, such as having no options specified for a refactoring that
+   * requires them, or if only validation was requested.
+   */
+  void set change(SourceChange value) {
+    this._change = value;
+  }
 
   /**
    * The ids of source edits that are not known to be valid. An edit is not
@@ -4427,9 +5686,28 @@
    * to a member from an unknown type. This field will be omitted if the change
    * field is omitted or if there are no potential edits for the refactoring.
    */
-  List<String> potentialEdits;
+  List<String> get potentialEdits => _potentialEdits;
 
-  EditGetRefactoringResult(this.initialProblems, this.optionsProblems, this.finalProblems, {this.feedback, this.change, this.potentialEdits});
+  /**
+   * The ids of source edits that are not known to be valid. An edit is not
+   * known to be valid if there was insufficient type information for the
+   * server to be able to determine whether or not the code needs to be
+   * modified, such as when a member is being renamed and there is a reference
+   * to a member from an unknown type. This field will be omitted if the change
+   * field is omitted or if there are no potential edits for the refactoring.
+   */
+  void set potentialEdits(List<String> value) {
+    this._potentialEdits = value;
+  }
+
+  EditGetRefactoringResult(List<RefactoringProblem> initialProblems, List<RefactoringProblem> optionsProblems, List<RefactoringProblem> finalProblems, {RefactoringFeedback feedback, SourceChange change, List<String> potentialEdits}) {
+    this.initialProblems = initialProblems;
+    this.optionsProblems = optionsProblems;
+    this.finalProblems = finalProblems;
+    this.feedback = feedback;
+    this.change = change;
+    this.potentialEdits = potentialEdits;
+  }
 
   factory EditGetRefactoringResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4535,12 +5813,24 @@
  * }
  */
 class EditSortMembersParams implements HasToJson {
+  String _file;
+
   /**
    * The Dart file to sort.
    */
-  String file;
+  String get file => _file;
 
-  EditSortMembersParams(this.file);
+  /**
+   * The Dart file to sort.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
+
+  EditSortMembersParams(String file) {
+    this.file = file;
+  }
 
   factory EditSortMembersParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4601,13 +5891,26 @@
  * }
  */
 class EditSortMembersResult implements HasToJson {
+  SourceFileEdit _edit;
+
   /**
    * The file edit that is to be applied to the given file to effect the
    * sorting.
    */
-  SourceFileEdit edit;
+  SourceFileEdit get edit => _edit;
 
-  EditSortMembersResult(this.edit);
+  /**
+   * The file edit that is to be applied to the given file to effect the
+   * sorting.
+   */
+  void set edit(SourceFileEdit value) {
+    assert(value != null);
+    this._edit = value;
+  }
+
+  EditSortMembersResult(SourceFileEdit edit) {
+    this.edit = edit;
+  }
 
   factory EditSortMembersResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4668,13 +5971,26 @@
  * }
  */
 class ExecutionCreateContextParams implements HasToJson {
+  String _contextRoot;
+
   /**
    * The path of the Dart or HTML file that will be launched, or the path of
    * the directory containing the file.
    */
-  String contextRoot;
+  String get contextRoot => _contextRoot;
 
-  ExecutionCreateContextParams(this.contextRoot);
+  /**
+   * The path of the Dart or HTML file that will be launched, or the path of
+   * the directory containing the file.
+   */
+  void set contextRoot(String value) {
+    assert(value != null);
+    this._contextRoot = value;
+  }
+
+  ExecutionCreateContextParams(String contextRoot) {
+    this.contextRoot = contextRoot;
+  }
 
   factory ExecutionCreateContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4735,12 +6051,24 @@
  * }
  */
 class ExecutionCreateContextResult implements HasToJson {
+  String _id;
+
   /**
    * The identifier used to refer to the execution context that was created.
    */
-  String id;
+  String get id => _id;
 
-  ExecutionCreateContextResult(this.id);
+  /**
+   * The identifier used to refer to the execution context that was created.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  ExecutionCreateContextResult(String id) {
+    this.id = id;
+  }
 
   factory ExecutionCreateContextResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4801,12 +6129,24 @@
  * }
  */
 class ExecutionDeleteContextParams implements HasToJson {
+  String _id;
+
   /**
    * The identifier of the execution context that is to be deleted.
    */
-  String id;
+  String get id => _id;
 
-  ExecutionDeleteContextParams(this.id);
+  /**
+   * The identifier of the execution context that is to be deleted.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  ExecutionDeleteContextParams(String id) {
+    this.id = id;
+  }
 
   factory ExecutionDeleteContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4890,22 +6230,54 @@
  * }
  */
 class ExecutionMapUriParams implements HasToJson {
+  String _id;
+
+  String _file;
+
+  String _uri;
+
   /**
    * The identifier of the execution context in which the URI is to be mapped.
    */
-  String id;
+  String get id => _id;
+
+  /**
+   * The identifier of the execution context in which the URI is to be mapped.
+   */
+  void set id(String value) {
+    assert(value != null);
+    this._id = value;
+  }
 
   /**
    * The path of the file to be mapped into a URI.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The path of the file to be mapped into a URI.
+   */
+  void set file(String value) {
+    this._file = value;
+  }
 
   /**
    * The URI to be mapped into a file path.
    */
-  String uri;
+  String get uri => _uri;
 
-  ExecutionMapUriParams(this.id, {this.file, this.uri});
+  /**
+   * The URI to be mapped into a file path.
+   */
+  void set uri(String value) {
+    this._uri = value;
+  }
+
+  ExecutionMapUriParams(String id, {String file, String uri}) {
+    this.id = id;
+    this.file = file;
+    this.uri = uri;
+  }
 
   factory ExecutionMapUriParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -4985,19 +6357,42 @@
  * }
  */
 class ExecutionMapUriResult implements HasToJson {
+  String _file;
+
+  String _uri;
+
   /**
    * The file to which the URI was mapped. This field is omitted if the uri
    * field was not given in the request.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file to which the URI was mapped. This field is omitted if the uri
+   * field was not given in the request.
+   */
+  void set file(String value) {
+    this._file = value;
+  }
 
   /**
    * The URI to which the file path was mapped. This field is omitted if the
    * file field was not given in the request.
    */
-  String uri;
+  String get uri => _uri;
 
-  ExecutionMapUriResult({this.file, this.uri});
+  /**
+   * The URI to which the file path was mapped. This field is omitted if the
+   * file field was not given in the request.
+   */
+  void set uri(String value) {
+    this._uri = value;
+  }
+
+  ExecutionMapUriResult({String file, String uri}) {
+    this.file = file;
+    this.uri = uri;
+  }
 
   factory ExecutionMapUriResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5067,12 +6462,24 @@
  * }
  */
 class ExecutionSetSubscriptionsParams implements HasToJson {
+  List<ExecutionService> _subscriptions;
+
   /**
    * A list of the services being subscribed to.
    */
-  List<ExecutionService> subscriptions;
+  List<ExecutionService> get subscriptions => _subscriptions;
 
-  ExecutionSetSubscriptionsParams(this.subscriptions);
+  /**
+   * A list of the services being subscribed to.
+   */
+  void set subscriptions(List<ExecutionService> value) {
+    assert(value != null);
+    this._subscriptions = value;
+  }
+
+  ExecutionSetSubscriptionsParams(List<ExecutionService> subscriptions) {
+    this.subscriptions = subscriptions;
+  }
 
   factory ExecutionSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5156,25 +6563,60 @@
  * }
  */
 class ExecutionLaunchDataParams implements HasToJson {
+  String _file;
+
+  ExecutableKind _kind;
+
+  List<String> _referencedFiles;
+
   /**
    * The file for which launch data is being provided. This will either be a
    * Dart library or an HTML file.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file for which launch data is being provided. This will either be a
+   * Dart library or an HTML file.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The kind of the executable file. This field is omitted if the file is not
    * a Dart file.
    */
-  ExecutableKind kind;
+  ExecutableKind get kind => _kind;
+
+  /**
+   * The kind of the executable file. This field is omitted if the file is not
+   * a Dart file.
+   */
+  void set kind(ExecutableKind value) {
+    this._kind = value;
+  }
 
   /**
    * A list of the Dart files that are referenced by the file. This field is
    * omitted if the file is not an HTML file.
    */
-  List<String> referencedFiles;
+  List<String> get referencedFiles => _referencedFiles;
 
-  ExecutionLaunchDataParams(this.file, {this.kind, this.referencedFiles});
+  /**
+   * A list of the Dart files that are referenced by the file. This field is
+   * omitted if the file is not an HTML file.
+   */
+  void set referencedFiles(List<String> value) {
+    this._referencedFiles = value;
+  }
+
+  ExecutionLaunchDataParams(String file, {ExecutableKind kind, List<String> referencedFiles}) {
+    this.file = file;
+    this.kind = kind;
+    this.referencedFiles = referencedFiles;
+  }
 
   factory ExecutionLaunchDataParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5254,12 +6696,24 @@
  * }
  */
 class AddContentOverlay implements HasToJson {
+  String _content;
+
   /**
    * The new content of the file.
    */
-  String content;
+  String get content => _content;
 
-  AddContentOverlay(this.content);
+  /**
+   * The new content of the file.
+   */
+  void set content(String value) {
+    assert(value != null);
+    this._content = value;
+  }
+
+  AddContentOverlay(String content) {
+    this.content = content;
+  }
 
   factory AddContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5320,35 +6774,93 @@
  * }
  */
 class AnalysisError implements HasToJson {
+  AnalysisErrorSeverity _severity;
+
+  AnalysisErrorType _type;
+
+  Location _location;
+
+  String _message;
+
+  String _correction;
+
   /**
    * The severity of the error.
    */
-  AnalysisErrorSeverity severity;
+  AnalysisErrorSeverity get severity => _severity;
+
+  /**
+   * The severity of the error.
+   */
+  void set severity(AnalysisErrorSeverity value) {
+    assert(value != null);
+    this._severity = value;
+  }
 
   /**
    * The type of the error.
    */
-  AnalysisErrorType type;
+  AnalysisErrorType get type => _type;
+
+  /**
+   * The type of the error.
+   */
+  void set type(AnalysisErrorType value) {
+    assert(value != null);
+    this._type = value;
+  }
 
   /**
    * The location associated with the error.
    */
-  Location location;
+  Location get location => _location;
+
+  /**
+   * The location associated with the error.
+   */
+  void set location(Location value) {
+    assert(value != null);
+    this._location = value;
+  }
 
   /**
    * The message to be displayed for this error. The message should indicate
    * what is wrong with the code and why it is wrong.
    */
-  String message;
+  String get message => _message;
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong with the code and why it is wrong.
+   */
+  void set message(String value) {
+    assert(value != null);
+    this._message = value;
+  }
 
   /**
    * The correction message to be displayed for this error. The correction
    * message should indicate how the user can fix the error. The field is
    * omitted if there is no correction message associated with the error code.
    */
-  String correction;
+  String get correction => _correction;
 
-  AnalysisError(this.severity, this.type, this.location, this.message, {this.correction});
+  /**
+   * The correction message to be displayed for this error. The correction
+   * message should indicate how the user can fix the error. The field is
+   * omitted if there is no correction message associated with the error code.
+   */
+  void set correction(String value) {
+    this._correction = value;
+  }
+
+  AnalysisError(AnalysisErrorSeverity severity, AnalysisErrorType type, Location location, String message, {String correction}) {
+    this.severity = severity;
+    this.type = type;
+    this.location = location;
+    this.message = message;
+    this.correction = correction;
+  }
 
   factory AnalysisError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5437,19 +6949,42 @@
  * }
  */
 class AnalysisErrorFixes implements HasToJson {
+  AnalysisError _error;
+
+  List<SourceChange> _fixes;
+
   /**
    * The error with which the fixes are associated.
    */
-  AnalysisError error;
+  AnalysisError get error => _error;
+
+  /**
+   * The error with which the fixes are associated.
+   */
+  void set error(AnalysisError value) {
+    assert(value != null);
+    this._error = value;
+  }
 
   /**
    * The fixes associated with the error.
    */
-  List<SourceChange> fixes;
+  List<SourceChange> get fixes => _fixes;
 
-  AnalysisErrorFixes(this.error, {this.fixes}) {
+  /**
+   * The fixes associated with the error.
+   */
+  void set fixes(List<SourceChange> value) {
+    assert(value != null);
+    this._fixes = value;
+  }
+
+  AnalysisErrorFixes(AnalysisError error, {List<SourceChange> fixes}) {
+    this.error = error;
     if (fixes == null) {
-      fixes = <SourceChange>[];
+      this.fixes = <SourceChange>[];
+    } else {
+      this.fixes = fixes;
     }
   }
 
@@ -5651,12 +7186,35 @@
  * }
  */
 class AnalysisOptions implements HasToJson {
+  bool _enableAsync;
+
+  bool _enableDeferredLoading;
+
+  bool _enableEnums;
+
+  bool _enableNullAwareOperators;
+
+  bool _generateDart2jsHints;
+
+  bool _generateHints;
+
+  bool _generateLints;
+
   /**
    * Deprecated
    *
    * True if the client wants to enable support for the proposed async feature.
    */
-  bool enableAsync;
+  bool get enableAsync => _enableAsync;
+
+  /**
+   * Deprecated
+   *
+   * True if the client wants to enable support for the proposed async feature.
+   */
+  void set enableAsync(bool value) {
+    this._enableAsync = value;
+  }
 
   /**
    * Deprecated
@@ -5664,40 +7222,99 @@
    * True if the client wants to enable support for the proposed deferred
    * loading feature.
    */
-  bool enableDeferredLoading;
+  bool get enableDeferredLoading => _enableDeferredLoading;
+
+  /**
+   * Deprecated
+   *
+   * True if the client wants to enable support for the proposed deferred
+   * loading feature.
+   */
+  void set enableDeferredLoading(bool value) {
+    this._enableDeferredLoading = value;
+  }
 
   /**
    * Deprecated
    *
    * True if the client wants to enable support for the proposed enum feature.
    */
-  bool enableEnums;
+  bool get enableEnums => _enableEnums;
+
+  /**
+   * Deprecated
+   *
+   * True if the client wants to enable support for the proposed enum feature.
+   */
+  void set enableEnums(bool value) {
+    this._enableEnums = value;
+  }
 
   /**
    * True if the client wants to enable support for the proposed "null aware
    * operators" feature.
    */
-  bool enableNullAwareOperators;
+  bool get enableNullAwareOperators => _enableNullAwareOperators;
+
+  /**
+   * True if the client wants to enable support for the proposed "null aware
+   * operators" feature.
+   */
+  void set enableNullAwareOperators(bool value) {
+    this._enableNullAwareOperators = value;
+  }
 
   /**
    * True if hints that are specific to dart2js should be generated. This
    * option is ignored if generateHints is false.
    */
-  bool generateDart2jsHints;
+  bool get generateDart2jsHints => _generateDart2jsHints;
+
+  /**
+   * True if hints that are specific to dart2js should be generated. This
+   * option is ignored if generateHints is false.
+   */
+  void set generateDart2jsHints(bool value) {
+    this._generateDart2jsHints = value;
+  }
 
   /**
    * True if hints should be generated as part of generating errors and
    * warnings.
    */
-  bool generateHints;
+  bool get generateHints => _generateHints;
+
+  /**
+   * True if hints should be generated as part of generating errors and
+   * warnings.
+   */
+  void set generateHints(bool value) {
+    this._generateHints = value;
+  }
 
   /**
    * True if lints should be generated as part of generating errors and
    * warnings.
    */
-  bool generateLints;
+  bool get generateLints => _generateLints;
 
-  AnalysisOptions({this.enableAsync, this.enableDeferredLoading, this.enableEnums, this.enableNullAwareOperators, this.generateDart2jsHints, this.generateHints, this.generateLints});
+  /**
+   * True if lints should be generated as part of generating errors and
+   * warnings.
+   */
+  void set generateLints(bool value) {
+    this._generateLints = value;
+  }
+
+  AnalysisOptions({bool enableAsync, bool enableDeferredLoading, bool enableEnums, bool enableNullAwareOperators, bool generateDart2jsHints, bool generateHints, bool generateLints}) {
+    this.enableAsync = enableAsync;
+    this.enableDeferredLoading = enableDeferredLoading;
+    this.enableEnums = enableEnums;
+    this.enableNullAwareOperators = enableNullAwareOperators;
+    this.generateDart2jsHints = generateDart2jsHints;
+    this.generateHints = generateHints;
+    this.generateLints = generateLints;
+  }
 
   factory AnalysisOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5878,18 +7495,41 @@
  * }
  */
 class AnalysisStatus implements HasToJson {
+  bool _isAnalyzing;
+
+  String _analysisTarget;
+
   /**
    * True if analysis is currently being performed.
    */
-  bool isAnalyzing;
+  bool get isAnalyzing => _isAnalyzing;
+
+  /**
+   * True if analysis is currently being performed.
+   */
+  void set isAnalyzing(bool value) {
+    assert(value != null);
+    this._isAnalyzing = value;
+  }
 
   /**
    * The name of the current target of analysis. This field is omitted if
    * analyzing is false.
    */
-  String analysisTarget;
+  String get analysisTarget => _analysisTarget;
 
-  AnalysisStatus(this.isAnalyzing, {this.analysisTarget});
+  /**
+   * The name of the current target of analysis. This field is omitted if
+   * analyzing is false.
+   */
+  void set analysisTarget(String value) {
+    this._analysisTarget = value;
+  }
+
+  AnalysisStatus(bool isAnalyzing, {String analysisTarget}) {
+    this.isAnalyzing = isAnalyzing;
+    this.analysisTarget = analysisTarget;
+  }
 
   factory AnalysisStatus.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -5951,12 +7591,24 @@
  * }
  */
 class ChangeContentOverlay implements HasToJson {
+  List<SourceEdit> _edits;
+
   /**
    * The edits to be applied to the file.
    */
-  List<SourceEdit> edits;
+  List<SourceEdit> get edits => _edits;
 
-  ChangeContentOverlay(this.edits);
+  /**
+   * The edits to be applied to the file.
+   */
+  void set edits(List<SourceEdit> value) {
+    assert(value != null);
+    this._edits = value;
+  }
+
+  ChangeContentOverlay(List<SourceEdit> edits) {
+    this.edits = edits;
+  }
 
   factory ChangeContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -6027,19 +7679,75 @@
  *   "hasNamedParameters": optional bool
  *   "parameterName": optional String
  *   "parameterType": optional String
+ *   "importUri": optional String
  * }
  */
 class CompletionSuggestion implements HasToJson {
+  CompletionSuggestionKind _kind;
+
+  int _relevance;
+
+  String _completion;
+
+  int _selectionOffset;
+
+  int _selectionLength;
+
+  bool _isDeprecated;
+
+  bool _isPotential;
+
+  String _docSummary;
+
+  String _docComplete;
+
+  String _declaringType;
+
+  Element _element;
+
+  String _returnType;
+
+  List<String> _parameterNames;
+
+  List<String> _parameterTypes;
+
+  int _requiredParameterCount;
+
+  bool _hasNamedParameters;
+
+  String _parameterName;
+
+  String _parameterType;
+
+  String _importUri;
+
   /**
    * The kind of element being suggested.
    */
-  CompletionSuggestionKind kind;
+  CompletionSuggestionKind get kind => _kind;
+
+  /**
+   * The kind of element being suggested.
+   */
+  void set kind(CompletionSuggestionKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The relevance of this completion suggestion where a higher number
    * indicates a higher relevance.
    */
-  int relevance;
+  int get relevance => _relevance;
+
+  /**
+   * The relevance of this completion suggestion where a higher number
+   * indicates a higher relevance.
+   */
+  void set relevance(int value) {
+    assert(value != null);
+    this._relevance = value;
+  }
 
   /**
    * The identifier to be inserted if the suggestion is selected. If the
@@ -6047,100 +7755,270 @@
    * additionally insert a template for the parameters. The information
    * required in order to do so is contained in other fields.
    */
-  String completion;
+  String get completion => _completion;
+
+  /**
+   * The identifier to be inserted if the suggestion is selected. If the
+   * suggestion is for a method or function, the client might want to
+   * additionally insert a template for the parameters. The information
+   * required in order to do so is contained in other fields.
+   */
+  void set completion(String value) {
+    assert(value != null);
+    this._completion = value;
+  }
 
   /**
    * The offset, relative to the beginning of the completion, of where the
    * selection should be placed after insertion.
    */
-  int selectionOffset;
+  int get selectionOffset => _selectionOffset;
+
+  /**
+   * The offset, relative to the beginning of the completion, of where the
+   * selection should be placed after insertion.
+   */
+  void set selectionOffset(int value) {
+    assert(value != null);
+    this._selectionOffset = value;
+  }
 
   /**
    * The number of characters that should be selected after insertion.
    */
-  int selectionLength;
+  int get selectionLength => _selectionLength;
+
+  /**
+   * The number of characters that should be selected after insertion.
+   */
+  void set selectionLength(int value) {
+    assert(value != null);
+    this._selectionLength = value;
+  }
 
   /**
    * True if the suggested element is deprecated.
    */
-  bool isDeprecated;
+  bool get isDeprecated => _isDeprecated;
+
+  /**
+   * True if the suggested element is deprecated.
+   */
+  void set isDeprecated(bool value) {
+    assert(value != null);
+    this._isDeprecated = value;
+  }
 
   /**
    * True if the element is not known to be valid for the target. This happens
    * if the type of the target is dynamic.
    */
-  bool isPotential;
+  bool get isPotential => _isPotential;
+
+  /**
+   * True if the element is not known to be valid for the target. This happens
+   * if the type of the target is dynamic.
+   */
+  void set isPotential(bool value) {
+    assert(value != null);
+    this._isPotential = value;
+  }
 
   /**
    * An abbreviated version of the Dartdoc associated with the element being
    * suggested, This field is omitted if there is no Dartdoc associated with
    * the element.
    */
-  String docSummary;
+  String get docSummary => _docSummary;
+
+  /**
+   * An abbreviated version of the Dartdoc associated with the element being
+   * suggested, This field is omitted if there is no Dartdoc associated with
+   * the element.
+   */
+  void set docSummary(String value) {
+    this._docSummary = value;
+  }
 
   /**
    * The Dartdoc associated with the element being suggested, This field is
    * omitted if there is no Dartdoc associated with the element.
    */
-  String docComplete;
+  String get docComplete => _docComplete;
+
+  /**
+   * The Dartdoc associated with the element being suggested, This field is
+   * omitted if there is no Dartdoc associated with the element.
+   */
+  void set docComplete(String value) {
+    this._docComplete = value;
+  }
 
   /**
    * The class that declares the element being suggested. This field is omitted
    * if the suggested element is not a member of a class.
    */
-  String declaringType;
+  String get declaringType => _declaringType;
+
+  /**
+   * The class that declares the element being suggested. This field is omitted
+   * if the suggested element is not a member of a class.
+   */
+  void set declaringType(String value) {
+    this._declaringType = value;
+  }
 
   /**
    * Information about the element reference being suggested.
    */
-  Element element;
+  Element get element => _element;
+
+  /**
+   * Information about the element reference being suggested.
+   */
+  void set element(Element value) {
+    this._element = value;
+  }
 
   /**
    * The return type of the getter, function or method or the type of the field
    * being suggested. This field is omitted if the suggested element is not a
    * getter, function or method.
    */
-  String returnType;
+  String get returnType => _returnType;
+
+  /**
+   * The return type of the getter, function or method or the type of the field
+   * being suggested. This field is omitted if the suggested element is not a
+   * getter, function or method.
+   */
+  void set returnType(String value) {
+    this._returnType = value;
+  }
 
   /**
    * The names of the parameters of the function or method being suggested.
    * This field is omitted if the suggested element is not a setter, function
    * or method.
    */
-  List<String> parameterNames;
+  List<String> get parameterNames => _parameterNames;
+
+  /**
+   * The names of the parameters of the function or method being suggested.
+   * This field is omitted if the suggested element is not a setter, function
+   * or method.
+   */
+  void set parameterNames(List<String> value) {
+    this._parameterNames = value;
+  }
 
   /**
    * The types of the parameters of the function or method being suggested.
    * This field is omitted if the parameterNames field is omitted.
    */
-  List<String> parameterTypes;
+  List<String> get parameterTypes => _parameterTypes;
+
+  /**
+   * The types of the parameters of the function or method being suggested.
+   * This field is omitted if the parameterNames field is omitted.
+   */
+  void set parameterTypes(List<String> value) {
+    this._parameterTypes = value;
+  }
 
   /**
    * The number of required parameters for the function or method being
    * suggested. This field is omitted if the parameterNames field is omitted.
    */
-  int requiredParameterCount;
+  int get requiredParameterCount => _requiredParameterCount;
+
+  /**
+   * The number of required parameters for the function or method being
+   * suggested. This field is omitted if the parameterNames field is omitted.
+   */
+  void set requiredParameterCount(int value) {
+    this._requiredParameterCount = value;
+  }
 
   /**
    * True if the function or method being suggested has at least one named
    * parameter. This field is omitted if the parameterNames field is omitted.
    */
-  bool hasNamedParameters;
+  bool get hasNamedParameters => _hasNamedParameters;
+
+  /**
+   * True if the function or method being suggested has at least one named
+   * parameter. This field is omitted if the parameterNames field is omitted.
+   */
+  void set hasNamedParameters(bool value) {
+    this._hasNamedParameters = value;
+  }
 
   /**
    * The name of the optional parameter being suggested. This field is omitted
    * if the suggestion is not the addition of an optional argument within an
    * argument list.
    */
-  String parameterName;
+  String get parameterName => _parameterName;
+
+  /**
+   * The name of the optional parameter being suggested. This field is omitted
+   * if the suggestion is not the addition of an optional argument within an
+   * argument list.
+   */
+  void set parameterName(String value) {
+    this._parameterName = value;
+  }
 
   /**
    * The type of the options parameter being suggested. This field is omitted
    * if the parameterName field is omitted.
    */
-  String parameterType;
+  String get parameterType => _parameterType;
 
-  CompletionSuggestion(this.kind, this.relevance, this.completion, this.selectionOffset, this.selectionLength, this.isDeprecated, this.isPotential, {this.docSummary, this.docComplete, this.declaringType, this.element, this.returnType, this.parameterNames, this.parameterTypes, this.requiredParameterCount, this.hasNamedParameters, this.parameterName, this.parameterType});
+  /**
+   * The type of the options parameter being suggested. This field is omitted
+   * if the parameterName field is omitted.
+   */
+  void set parameterType(String value) {
+    this._parameterType = value;
+  }
+
+  /**
+   * The import to be added if the suggestion is out of scope and needs an
+   * import to be added to be in scope.
+   */
+  String get importUri => _importUri;
+
+  /**
+   * The import to be added if the suggestion is out of scope and needs an
+   * import to be added to be in scope.
+   */
+  void set importUri(String value) {
+    this._importUri = value;
+  }
+
+  CompletionSuggestion(CompletionSuggestionKind kind, int relevance, String completion, int selectionOffset, int selectionLength, bool isDeprecated, bool isPotential, {String docSummary, String docComplete, String declaringType, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, int requiredParameterCount, bool hasNamedParameters, String parameterName, String parameterType, String importUri}) {
+    this.kind = kind;
+    this.relevance = relevance;
+    this.completion = completion;
+    this.selectionOffset = selectionOffset;
+    this.selectionLength = selectionLength;
+    this.isDeprecated = isDeprecated;
+    this.isPotential = isPotential;
+    this.docSummary = docSummary;
+    this.docComplete = docComplete;
+    this.declaringType = declaringType;
+    this.element = element;
+    this.returnType = returnType;
+    this.parameterNames = parameterNames;
+    this.parameterTypes = parameterTypes;
+    this.requiredParameterCount = requiredParameterCount;
+    this.hasNamedParameters = hasNamedParameters;
+    this.parameterName = parameterName;
+    this.parameterType = parameterType;
+    this.importUri = importUri;
+  }
 
   factory CompletionSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -6233,7 +8111,11 @@
       if (json.containsKey("parameterType")) {
         parameterType = jsonDecoder._decodeString(jsonPath + ".parameterType", json["parameterType"]);
       }
-      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, hasNamedParameters: hasNamedParameters, parameterName: parameterName, parameterType: parameterType);
+      String importUri;
+      if (json.containsKey("importUri")) {
+        importUri = jsonDecoder._decodeString(jsonPath + ".importUri", json["importUri"]);
+      }
+      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, hasNamedParameters: hasNamedParameters, parameterName: parameterName, parameterType: parameterType, importUri: importUri);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion");
     }
@@ -6281,6 +8163,9 @@
     if (parameterType != null) {
       result["parameterType"] = parameterType;
     }
+    if (importUri != null) {
+      result["importUri"] = importUri;
+    }
     return result;
   }
 
@@ -6307,7 +8192,8 @@
           requiredParameterCount == other.requiredParameterCount &&
           hasNamedParameters == other.hasNamedParameters &&
           parameterName == other.parameterName &&
-          parameterType == other.parameterType;
+          parameterType == other.parameterType &&
+          importUri == other.importUri;
     }
     return false;
   }
@@ -6333,6 +8219,7 @@
     hash = _JenkinsSmiHash.combine(hash, hasNamedParameters.hashCode);
     hash = _JenkinsSmiHash.combine(hash, parameterName.hashCode);
     hash = _JenkinsSmiHash.combine(hash, parameterType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, importUri.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
 }
@@ -6384,6 +8271,11 @@
    */
   static const KEYWORD = const CompletionSuggestionKind._("KEYWORD");
 
+  /**
+   * A named argument for the current callsite is being suggested. For
+   * suggestions of this kind, the completion is the named argument identifier
+   * including a trailing ':' and space.
+   */
   static const NAMED_ARGUMENT = const CompletionSuggestionKind._("NAMED_ARGUMENT");
 
   static const OPTIONAL_ARGUMENT = const CompletionSuggestionKind._("OPTIONAL_ARGUMENT");
@@ -6470,21 +8362,59 @@
     return flags;
   }
 
+  ElementKind _kind;
+
+  String _name;
+
+  Location _location;
+
+  int _flags;
+
+  String _parameters;
+
+  String _returnType;
+
+  String _typeParameters;
+
   /**
    * The kind of the element.
    */
-  ElementKind kind;
+  ElementKind get kind => _kind;
+
+  /**
+   * The kind of the element.
+   */
+  void set kind(ElementKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The name of the element. This is typically used as the label in the
    * outline.
    */
-  String name;
+  String get name => _name;
+
+  /**
+   * The name of the element. This is typically used as the label in the
+   * outline.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
 
   /**
    * The location of the name in the declaration of the element.
    */
-  Location location;
+  Location get location => _location;
+
+  /**
+   * The location of the name in the declaration of the element.
+   */
+  void set location(Location value) {
+    this._location = value;
+  }
 
   /**
    * A bit-map containing the following flags:
@@ -6497,7 +8427,23 @@
    * - 0x10 - set if the element is private
    * - 0x20 - set if the element is deprecated
    */
-  int flags;
+  int get flags => _flags;
+
+  /**
+   * A bit-map containing the following flags:
+   *
+   * - 0x01 - set if the element is explicitly or implicitly abstract
+   * - 0x02 - set if the element was declared to be ‘const’
+   * - 0x04 - set if the element was declared to be ‘final’
+   * - 0x08 - set if the element is a static member of a class or is a
+   *   top-level function or field
+   * - 0x10 - set if the element is private
+   * - 0x20 - set if the element is deprecated
+   */
+  void set flags(int value) {
+    assert(value != null);
+    this._flags = value;
+  }
 
   /**
    * The parameter list for the element. If the element is not a method or
@@ -6505,22 +8451,57 @@
    * parameters (e.g. getter), this field will not be defined. If the element
    * has zero parameters, this field will have a value of "()".
    */
-  String parameters;
+  String get parameters => _parameters;
+
+  /**
+   * The parameter list for the element. If the element is not a method or
+   * function this field will not be defined. If the element doesn't have
+   * parameters (e.g. getter), this field will not be defined. If the element
+   * has zero parameters, this field will have a value of "()".
+   */
+  void set parameters(String value) {
+    this._parameters = value;
+  }
 
   /**
    * The return type of the element. If the element is not a method or function
    * this field will not be defined. If the element does not have a declared
    * return type, this field will contain an empty string.
    */
-  String returnType;
+  String get returnType => _returnType;
+
+  /**
+   * The return type of the element. If the element is not a method or function
+   * this field will not be defined. If the element does not have a declared
+   * return type, this field will contain an empty string.
+   */
+  void set returnType(String value) {
+    this._returnType = value;
+  }
 
   /**
    * The type parameter list for the element. If the element doesn't have type
    * parameters, this field will not be defined.
    */
-  String typeParameters;
+  String get typeParameters => _typeParameters;
 
-  Element(this.kind, this.name, this.flags, {this.location, this.parameters, this.returnType, this.typeParameters});
+  /**
+   * The type parameter list for the element. If the element doesn't have type
+   * parameters, this field will not be defined.
+   */
+  void set typeParameters(String value) {
+    this._typeParameters = value;
+  }
+
+  Element(ElementKind kind, String name, int flags, {Location location, String parameters, String returnType, String typeParameters}) {
+    this.kind = kind;
+    this.name = name;
+    this.location = location;
+    this.flags = flags;
+    this.parameters = parameters;
+    this.returnType = returnType;
+    this.typeParameters = typeParameters;
+  }
 
   factory Element.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -6783,17 +8764,40 @@
  * }
  */
 class ExecutableFile implements HasToJson {
+  String _file;
+
+  ExecutableKind _kind;
+
   /**
    * The path of the executable file.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The path of the executable file.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The kind of the executable file.
    */
-  ExecutableKind kind;
+  ExecutableKind get kind => _kind;
 
-  ExecutableFile(this.file, this.kind);
+  /**
+   * The kind of the executable file.
+   */
+  void set kind(ExecutableKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
+
+  ExecutableFile(String file, ExecutableKind kind) {
+    this.file = file;
+    this.kind = kind;
+  }
 
   factory ExecutableFile.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7023,22 +9027,56 @@
  * }
  */
 class FoldingRegion implements HasToJson {
+  FoldingKind _kind;
+
+  int _offset;
+
+  int _length;
+
   /**
    * The kind of the region.
    */
-  FoldingKind kind;
+  FoldingKind get kind => _kind;
+
+  /**
+   * The kind of the region.
+   */
+  void set kind(FoldingKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The offset of the region to be folded.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region to be folded.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region to be folded.
    */
-  int length;
+  int get length => _length;
 
-  FoldingRegion(this.kind, this.offset, this.length);
+  /**
+   * The length of the region to be folded.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  FoldingRegion(FoldingKind kind, int offset, int length) {
+    this.kind = kind;
+    this.offset = offset;
+    this.length = length;
+  }
 
   factory FoldingRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7110,22 +9148,56 @@
  * }
  */
 class HighlightRegion implements HasToJson {
+  HighlightRegionType _type;
+
+  int _offset;
+
+  int _length;
+
   /**
    * The type of highlight associated with the region.
    */
-  HighlightRegionType type;
+  HighlightRegionType get type => _type;
+
+  /**
+   * The type of highlight associated with the region.
+   */
+  void set type(HighlightRegionType value) {
+    assert(value != null);
+    this._type = value;
+  }
 
   /**
    * The offset of the region to be highlighted.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region to be highlighted.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region to be highlighted.
    */
-  int length;
+  int get length => _length;
 
-  HighlightRegion(this.type, this.offset, this.length);
+  /**
+   * The length of the region to be highlighted.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  HighlightRegion(HighlightRegionType type, int offset, int length) {
+    this.type = type;
+    this.offset = offset;
+    this.length = length;
+  }
 
   factory HighlightRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7434,38 +9506,105 @@
  * }
  */
 class HoverInformation implements HasToJson {
+  int _offset;
+
+  int _length;
+
+  String _containingLibraryPath;
+
+  String _containingLibraryName;
+
+  String _containingClassDescription;
+
+  String _dartdoc;
+
+  String _elementDescription;
+
+  String _elementKind;
+
+  String _parameter;
+
+  String _propagatedType;
+
+  String _staticType;
+
   /**
    * The offset of the range of characters that encompases the cursor position
    * and has the same hover information as the cursor position.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the range of characters that encompases the cursor position
    * and has the same hover information as the cursor position.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The path to the defining compilation unit of the library in which the
    * referenced element is declared. This data is omitted if there is no
    * referenced element, or if the element is declared inside an HTML file.
    */
-  String containingLibraryPath;
+  String get containingLibraryPath => _containingLibraryPath;
+
+  /**
+   * The path to the defining compilation unit of the library in which the
+   * referenced element is declared. This data is omitted if there is no
+   * referenced element, or if the element is declared inside an HTML file.
+   */
+  void set containingLibraryPath(String value) {
+    this._containingLibraryPath = value;
+  }
 
   /**
    * The name of the library in which the referenced element is declared. This
    * data is omitted if there is no referenced element, or if the element is
    * declared inside an HTML file.
    */
-  String containingLibraryName;
+  String get containingLibraryName => _containingLibraryName;
+
+  /**
+   * The name of the library in which the referenced element is declared. This
+   * data is omitted if there is no referenced element, or if the element is
+   * declared inside an HTML file.
+   */
+  void set containingLibraryName(String value) {
+    this._containingLibraryName = value;
+  }
 
   /**
    * A human-readable description of the class declaring the element being
    * referenced. This data is omitted if there is no referenced element, or if
    * the element is not a class member.
    */
-  String containingClassDescription;
+  String get containingClassDescription => _containingClassDescription;
+
+  /**
+   * A human-readable description of the class declaring the element being
+   * referenced. This data is omitted if there is no referenced element, or if
+   * the element is not a class member.
+   */
+  void set containingClassDescription(String value) {
+    this._containingClassDescription = value;
+  }
 
   /**
    * The dartdoc associated with the referenced element. Other than the removal
@@ -7473,42 +9612,107 @@
    * block comment, the dartdoc is unprocessed markdown. This data is omitted
    * if there is no referenced element, or if the element has no dartdoc.
    */
-  String dartdoc;
+  String get dartdoc => _dartdoc;
+
+  /**
+   * The dartdoc associated with the referenced element. Other than the removal
+   * of the comment delimiters, including leading asterisks in the case of a
+   * block comment, the dartdoc is unprocessed markdown. This data is omitted
+   * if there is no referenced element, or if the element has no dartdoc.
+   */
+  void set dartdoc(String value) {
+    this._dartdoc = value;
+  }
 
   /**
    * A human-readable description of the element being referenced. This data is
    * omitted if there is no referenced element.
    */
-  String elementDescription;
+  String get elementDescription => _elementDescription;
+
+  /**
+   * A human-readable description of the element being referenced. This data is
+   * omitted if there is no referenced element.
+   */
+  void set elementDescription(String value) {
+    this._elementDescription = value;
+  }
 
   /**
    * A human-readable description of the kind of element being referenced (such
    * as “class” or “function type alias”). This data is omitted if there is no
    * referenced element.
    */
-  String elementKind;
+  String get elementKind => _elementKind;
+
+  /**
+   * A human-readable description of the kind of element being referenced (such
+   * as “class” or “function type alias”). This data is omitted if there is no
+   * referenced element.
+   */
+  void set elementKind(String value) {
+    this._elementKind = value;
+  }
 
   /**
    * A human-readable description of the parameter corresponding to the
    * expression being hovered over. This data is omitted if the location is not
    * in an argument to a function.
    */
-  String parameter;
+  String get parameter => _parameter;
+
+  /**
+   * A human-readable description of the parameter corresponding to the
+   * expression being hovered over. This data is omitted if the location is not
+   * in an argument to a function.
+   */
+  void set parameter(String value) {
+    this._parameter = value;
+  }
 
   /**
    * The name of the propagated type of the expression. This data is omitted if
    * the location does not correspond to an expression or if there is no
    * propagated type information.
    */
-  String propagatedType;
+  String get propagatedType => _propagatedType;
+
+  /**
+   * The name of the propagated type of the expression. This data is omitted if
+   * the location does not correspond to an expression or if there is no
+   * propagated type information.
+   */
+  void set propagatedType(String value) {
+    this._propagatedType = value;
+  }
 
   /**
    * The name of the static type of the expression. This data is omitted if the
    * location does not correspond to an expression.
    */
-  String staticType;
+  String get staticType => _staticType;
 
-  HoverInformation(this.offset, this.length, {this.containingLibraryPath, this.containingLibraryName, this.containingClassDescription, this.dartdoc, this.elementDescription, this.elementKind, this.parameter, this.propagatedType, this.staticType});
+  /**
+   * The name of the static type of the expression. This data is omitted if the
+   * location does not correspond to an expression.
+   */
+  void set staticType(String value) {
+    this._staticType = value;
+  }
+
+  HoverInformation(int offset, int length, {String containingLibraryPath, String containingLibraryName, String containingClassDescription, String dartdoc, String elementDescription, String elementKind, String parameter, String propagatedType, String staticType}) {
+    this.offset = offset;
+    this.length = length;
+    this.containingLibraryPath = containingLibraryPath;
+    this.containingLibraryName = containingLibraryName;
+    this.containingClassDescription = containingClassDescription;
+    this.dartdoc = dartdoc;
+    this.elementDescription = elementDescription;
+    this.elementKind = elementKind;
+    this.parameter = parameter;
+    this.propagatedType = propagatedType;
+    this.staticType = staticType;
+  }
 
   factory HoverInformation.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7652,23 +9856,58 @@
  * }
  */
 class LinkedEditGroup implements HasToJson {
+  List<Position> _positions;
+
+  int _length;
+
+  List<LinkedEditSuggestion> _suggestions;
+
   /**
    * The positions of the regions that should be edited simultaneously.
    */
-  List<Position> positions;
+  List<Position> get positions => _positions;
+
+  /**
+   * The positions of the regions that should be edited simultaneously.
+   */
+  void set positions(List<Position> value) {
+    assert(value != null);
+    this._positions = value;
+  }
 
   /**
    * The length of the regions that should be edited simultaneously.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the regions that should be edited simultaneously.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * Pre-computed suggestions for what every region might want to be changed
    * to.
    */
-  List<LinkedEditSuggestion> suggestions;
+  List<LinkedEditSuggestion> get suggestions => _suggestions;
 
-  LinkedEditGroup(this.positions, this.length, this.suggestions);
+  /**
+   * Pre-computed suggestions for what every region might want to be changed
+   * to.
+   */
+  void set suggestions(List<LinkedEditSuggestion> value) {
+    assert(value != null);
+    this._suggestions = value;
+  }
+
+  LinkedEditGroup(List<Position> positions, int length, List<LinkedEditSuggestion> suggestions) {
+    this.positions = positions;
+    this.length = length;
+    this.suggestions = suggestions;
+  }
 
   factory LinkedEditGroup.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7759,17 +9998,40 @@
  * }
  */
 class LinkedEditSuggestion implements HasToJson {
+  String _value;
+
+  LinkedEditSuggestionKind _kind;
+
   /**
    * The value that could be used to replace all of the linked edit regions.
    */
-  String value;
+  String get value => _value;
+
+  /**
+   * The value that could be used to replace all of the linked edit regions.
+   */
+  void set value(String value) {
+    assert(value != null);
+    this._value = value;
+  }
 
   /**
    * The kind of value being proposed.
    */
-  LinkedEditSuggestionKind kind;
+  LinkedEditSuggestionKind get kind => _kind;
 
-  LinkedEditSuggestion(this.value, this.kind);
+  /**
+   * The kind of value being proposed.
+   */
+  void set kind(LinkedEditSuggestionKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
+
+  LinkedEditSuggestion(String value, LinkedEditSuggestionKind kind) {
+    this.value = value;
+    this.kind = kind;
+  }
 
   factory LinkedEditSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -7893,34 +10155,92 @@
  * }
  */
 class Location implements HasToJson {
+  String _file;
+
+  int _offset;
+
+  int _length;
+
+  int _startLine;
+
+  int _startColumn;
+
   /**
    * The file containing the range.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the range.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the range.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the range.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the range.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the range.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The one-based index of the line containing the first character of the
    * range.
    */
-  int startLine;
+  int get startLine => _startLine;
+
+  /**
+   * The one-based index of the line containing the first character of the
+   * range.
+   */
+  void set startLine(int value) {
+    assert(value != null);
+    this._startLine = value;
+  }
 
   /**
    * The one-based index of the column containing the first character of the
    * range.
    */
-  int startColumn;
+  int get startColumn => _startColumn;
 
-  Location(this.file, this.offset, this.length, this.startLine, this.startColumn);
+  /**
+   * The one-based index of the column containing the first character of the
+   * range.
+   */
+  void set startColumn(int value) {
+    assert(value != null);
+    this._startColumn = value;
+  }
+
+  Location(String file, int offset, int length, int startLine, int startColumn) {
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+    this.startLine = startLine;
+    this.startColumn = startColumn;
+  }
 
   factory Location.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8010,24 +10330,60 @@
  * }
  */
 class NavigationRegion implements HasToJson {
+  int _offset;
+
+  int _length;
+
+  List<int> _targets;
+
   /**
    * The offset of the region from which the user can navigate.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region from which the user can navigate.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region from which the user can navigate.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the region from which the user can navigate.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The indexes of the targets (in the enclosing navigation response) to which
    * the given region is bound. By opening the target, clients can implement
    * one form of navigation.
    */
-  List<int> targets;
+  List<int> get targets => _targets;
 
-  NavigationRegion(this.offset, this.length, this.targets);
+  /**
+   * The indexes of the targets (in the enclosing navigation response) to which
+   * the given region is bound. By opening the target, clients can implement
+   * one form of navigation.
+   */
+  void set targets(List<int> value) {
+    assert(value != null);
+    this._targets = value;
+  }
+
+  NavigationRegion(int offset, int length, List<int> targets) {
+    this.offset = offset;
+    this.length = length;
+    this.targets = targets;
+  }
 
   factory NavigationRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8102,40 +10458,110 @@
  * }
  */
 class NavigationTarget implements HasToJson {
+  ElementKind _kind;
+
+  int _fileIndex;
+
+  int _offset;
+
+  int _length;
+
+  int _startLine;
+
+  int _startColumn;
+
   /**
    * The kind of the element.
    */
-  ElementKind kind;
+  ElementKind get kind => _kind;
+
+  /**
+   * The kind of the element.
+   */
+  void set kind(ElementKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The index of the file (in the enclosing navigation response) to navigate
    * to.
    */
-  int fileIndex;
+  int get fileIndex => _fileIndex;
+
+  /**
+   * The index of the file (in the enclosing navigation response) to navigate
+   * to.
+   */
+  void set fileIndex(int value) {
+    assert(value != null);
+    this._fileIndex = value;
+  }
 
   /**
    * The offset of the region from which the user can navigate.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region from which the user can navigate.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region from which the user can navigate.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the region from which the user can navigate.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The one-based index of the line containing the first character of the
    * region.
    */
-  int startLine;
+  int get startLine => _startLine;
+
+  /**
+   * The one-based index of the line containing the first character of the
+   * region.
+   */
+  void set startLine(int value) {
+    assert(value != null);
+    this._startLine = value;
+  }
 
   /**
    * The one-based index of the column containing the first character of the
    * region.
    */
-  int startColumn;
+  int get startColumn => _startColumn;
 
-  NavigationTarget(this.kind, this.fileIndex, this.offset, this.length, this.startLine, this.startColumn);
+  /**
+   * The one-based index of the column containing the first character of the
+   * region.
+   */
+  void set startColumn(int value) {
+    assert(value != null);
+    this._startColumn = value;
+  }
+
+  NavigationTarget(ElementKind kind, int fileIndex, int offset, int length, int startLine, int startColumn) {
+    this.kind = kind;
+    this.fileIndex = fileIndex;
+    this.offset = offset;
+    this.length = length;
+    this.startLine = startLine;
+    this.startColumn = startColumn;
+  }
 
   factory NavigationTarget.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8234,22 +10660,56 @@
  * }
  */
 class Occurrences implements HasToJson {
+  Element _element;
+
+  List<int> _offsets;
+
+  int _length;
+
   /**
    * The element that was referenced.
    */
-  Element element;
+  Element get element => _element;
+
+  /**
+   * The element that was referenced.
+   */
+  void set element(Element value) {
+    assert(value != null);
+    this._element = value;
+  }
 
   /**
    * The offsets of the name of the referenced element within the file.
    */
-  List<int> offsets;
+  List<int> get offsets => _offsets;
+
+  /**
+   * The offsets of the name of the referenced element within the file.
+   */
+  void set offsets(List<int> value) {
+    assert(value != null);
+    this._offsets = value;
+  }
 
   /**
    * The length of the name of the referenced element.
    */
-  int length;
+  int get length => _length;
 
-  Occurrences(this.element, this.offsets, this.length);
+  /**
+   * The length of the name of the referenced element.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
+
+  Occurrences(Element element, List<int> offsets, int length) {
+    this.element = element;
+    this.offsets = offsets;
+    this.length = length;
+  }
 
   factory Occurrences.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8322,10 +10782,26 @@
  * }
  */
 class Outline implements HasToJson {
+  Element _element;
+
+  int _offset;
+
+  int _length;
+
+  List<Outline> _children;
+
   /**
    * A description of the element represented by this node.
    */
-  Element element;
+  Element get element => _element;
+
+  /**
+   * A description of the element represented by this node.
+   */
+  void set element(Element value) {
+    assert(value != null);
+    this._element = value;
+  }
 
   /**
    * The offset of the first character of the element. This is different than
@@ -8333,20 +10809,52 @@
    * It can be used, for example, to map locations in the file back to an
    * outline.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the first character of the element. This is different than
+   * the offset in the Element, which if the offset of the name of the element.
+   * It can be used, for example, to map locations in the file back to an
+   * outline.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the element.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the element.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The children of the node. The field will be omitted if the node has no
    * children.
    */
-  List<Outline> children;
+  List<Outline> get children => _children;
 
-  Outline(this.element, this.offset, this.length, {this.children});
+  /**
+   * The children of the node. The field will be omitted if the node has no
+   * children.
+   */
+  void set children(List<Outline> value) {
+    this._children = value;
+  }
+
+  Outline(Element element, int offset, int length, {List<Outline> children}) {
+    this.element = element;
+    this.offset = offset;
+    this.length = length;
+    this.children = children;
+  }
 
   factory Outline.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8428,31 +10936,78 @@
  * }
  */
 class Override implements HasToJson {
+  int _offset;
+
+  int _length;
+
+  OverriddenMember _superclassMember;
+
+  List<OverriddenMember> _interfaceMembers;
+
   /**
    * The offset of the name of the overriding member.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the name of the overriding member.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the name of the overriding member.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the name of the overriding member.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The member inherited from a superclass that is overridden by the
    * overriding member. The field is omitted if there is no superclass member,
    * in which case there must be at least one interface member.
    */
-  OverriddenMember superclassMember;
+  OverriddenMember get superclassMember => _superclassMember;
+
+  /**
+   * The member inherited from a superclass that is overridden by the
+   * overriding member. The field is omitted if there is no superclass member,
+   * in which case there must be at least one interface member.
+   */
+  void set superclassMember(OverriddenMember value) {
+    this._superclassMember = value;
+  }
 
   /**
    * The members inherited from interfaces that are overridden by the
    * overriding member. The field is omitted if there are no interface members,
    * in which case there must be a superclass member.
    */
-  List<OverriddenMember> interfaceMembers;
+  List<OverriddenMember> get interfaceMembers => _interfaceMembers;
 
-  Override(this.offset, this.length, {this.superclassMember, this.interfaceMembers});
+  /**
+   * The members inherited from interfaces that are overridden by the
+   * overriding member. The field is omitted if there are no interface members,
+   * in which case there must be a superclass member.
+   */
+  void set interfaceMembers(List<OverriddenMember> value) {
+    this._interfaceMembers = value;
+  }
+
+  Override(int offset, int length, {OverriddenMember superclassMember, List<OverriddenMember> interfaceMembers}) {
+    this.offset = offset;
+    this.length = length;
+    this.superclassMember = superclassMember;
+    this.interfaceMembers = interfaceMembers;
+  }
 
   factory Override.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8532,17 +11087,40 @@
  * }
  */
 class OverriddenMember implements HasToJson {
+  Element _element;
+
+  String _className;
+
   /**
    * The element that is being overridden.
    */
-  Element element;
+  Element get element => _element;
+
+  /**
+   * The element that is being overridden.
+   */
+  void set element(Element value) {
+    assert(value != null);
+    this._element = value;
+  }
 
   /**
    * The name of the class in which the member is defined.
    */
-  String className;
+  String get className => _className;
 
-  OverriddenMember(this.element, this.className);
+  /**
+   * The name of the class in which the member is defined.
+   */
+  void set className(String value) {
+    assert(value != null);
+    this._className = value;
+  }
+
+  OverriddenMember(Element element, String className) {
+    this.element = element;
+    this.className = className;
+  }
 
   factory OverriddenMember.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8604,17 +11182,40 @@
  * }
  */
 class Position implements HasToJson {
+  String _file;
+
+  int _offset;
+
   /**
    * The file containing the position.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the position.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The offset of the position.
    */
-  int offset;
+  int get offset => _offset;
 
-  Position(this.file, this.offset);
+  /**
+   * The offset of the position.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
+
+  Position(String file, int offset) {
+    this.file = file;
+    this.offset = offset;
+  }
 
   factory Position.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8675,13 +11276,26 @@
  * }
  */
 class PubStatus implements HasToJson {
+  bool _isListingPackageDirs;
+
   /**
    * True if the server is currently running pub to produce a list of package
    * directories.
    */
-  bool isListingPackageDirs;
+  bool get isListingPackageDirs => _isListingPackageDirs;
 
-  PubStatus(this.isListingPackageDirs);
+  /**
+   * True if the server is currently running pub to produce a list of package
+   * directories.
+   */
+  void set isListingPackageDirs(bool value) {
+    assert(value != null);
+    this._isListingPackageDirs = value;
+  }
+
+  PubStatus(bool isListingPackageDirs) {
+    this.isListingPackageDirs = isListingPackageDirs;
+  }
 
   factory PubStatus.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -8821,36 +11435,94 @@
  * }
  */
 class RefactoringMethodParameter implements HasToJson {
+  String _id;
+
+  RefactoringMethodParameterKind _kind;
+
+  String _type;
+
+  String _name;
+
+  String _parameters;
+
   /**
    * The unique identifier of the parameter. Clients may omit this field for
    * the parameters they want to add.
    */
-  String id;
+  String get id => _id;
+
+  /**
+   * The unique identifier of the parameter. Clients may omit this field for
+   * the parameters they want to add.
+   */
+  void set id(String value) {
+    this._id = value;
+  }
 
   /**
    * The kind of the parameter.
    */
-  RefactoringMethodParameterKind kind;
+  RefactoringMethodParameterKind get kind => _kind;
+
+  /**
+   * The kind of the parameter.
+   */
+  void set kind(RefactoringMethodParameterKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * The type that should be given to the parameter, or the return type of the
    * parameter's function type.
    */
-  String type;
+  String get type => _type;
+
+  /**
+   * The type that should be given to the parameter, or the return type of the
+   * parameter's function type.
+   */
+  void set type(String value) {
+    assert(value != null);
+    this._type = value;
+  }
 
   /**
    * The name that should be given to the parameter.
    */
-  String name;
+  String get name => _name;
+
+  /**
+   * The name that should be given to the parameter.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
 
   /**
    * The parameter list of the parameter's function type. If the parameter is
    * not of a function type, this field will not be defined. If the function
    * type has zero parameters, this field will have a value of "()".
    */
-  String parameters;
+  String get parameters => _parameters;
 
-  RefactoringMethodParameter(this.kind, this.type, this.name, {this.id, this.parameters});
+  /**
+   * The parameter list of the parameter's function type. If the parameter is
+   * not of a function type, this field will not be defined. If the function
+   * type has zero parameters, this field will have a value of "()".
+   */
+  void set parameters(String value) {
+    this._parameters = value;
+  }
+
+  RefactoringMethodParameter(RefactoringMethodParameterKind kind, String type, String name, {String id, String parameters}) {
+    this.id = id;
+    this.kind = kind;
+    this.type = type;
+    this.name = name;
+    this.parameters = parameters;
+  }
 
   factory RefactoringMethodParameter.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -9066,24 +11738,59 @@
  * }
  */
 class RefactoringProblem implements HasToJson {
+  RefactoringProblemSeverity _severity;
+
+  String _message;
+
+  Location _location;
+
   /**
    * The severity of the problem being represented.
    */
-  RefactoringProblemSeverity severity;
+  RefactoringProblemSeverity get severity => _severity;
+
+  /**
+   * The severity of the problem being represented.
+   */
+  void set severity(RefactoringProblemSeverity value) {
+    assert(value != null);
+    this._severity = value;
+  }
 
   /**
    * A human-readable description of the problem being represented.
    */
-  String message;
+  String get message => _message;
+
+  /**
+   * A human-readable description of the problem being represented.
+   */
+  void set message(String value) {
+    assert(value != null);
+    this._message = value;
+  }
 
   /**
    * The location of the problem being represented. This field is omitted
    * unless there is a specific location associated with the problem (such as a
    * location where an element being renamed will be shadowed).
    */
-  Location location;
+  Location get location => _location;
 
-  RefactoringProblem(this.severity, this.message, {this.location});
+  /**
+   * The location of the problem being represented. This field is omitted
+   * unless there is a specific location associated with the problem (such as a
+   * location where an element being renamed will be shadowed).
+   */
+  void set location(Location value) {
+    this._location = value;
+  }
+
+  RefactoringProblem(RefactoringProblemSeverity severity, String message, {Location location}) {
+    this.severity = severity;
+    this.message = message;
+    this.location = location;
+  }
 
   factory RefactoringProblem.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -9269,23 +11976,57 @@
  * }
  */
 class RequestError implements HasToJson {
+  RequestErrorCode _code;
+
+  String _message;
+
+  String _stackTrace;
+
   /**
    * A code that uniquely identifies the error that occurred.
    */
-  RequestErrorCode code;
+  RequestErrorCode get code => _code;
+
+  /**
+   * A code that uniquely identifies the error that occurred.
+   */
+  void set code(RequestErrorCode value) {
+    assert(value != null);
+    this._code = value;
+  }
 
   /**
    * A short description of the error.
    */
-  String message;
+  String get message => _message;
+
+  /**
+   * A short description of the error.
+   */
+  void set message(String value) {
+    assert(value != null);
+    this._message = value;
+  }
 
   /**
    * The stack trace associated with processing the request, used for debugging
    * the server.
    */
-  String stackTrace;
+  String get stackTrace => _stackTrace;
 
-  RequestError(this.code, this.message, {this.stackTrace});
+  /**
+   * The stack trace associated with processing the request, used for debugging
+   * the server.
+   */
+  void set stackTrace(String value) {
+    this._stackTrace = value;
+  }
+
+  RequestError(RequestErrorCode code, String message, {String stackTrace}) {
+    this.code = code;
+    this.message = message;
+    this.stackTrace = stackTrace;
+  }
 
   factory RequestError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -9353,6 +12094,7 @@
  * enum {
  *   CONTENT_MODIFIED
  *   FORMAT_INVALID_FILE
+ *   FORMAT_WITH_ERRORS
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_ANALYSIS_ROOT
  *   INVALID_EXECUTION_CONTEXT
@@ -9386,6 +12128,11 @@
   static const FORMAT_INVALID_FILE = const RequestErrorCode._("FORMAT_INVALID_FILE");
 
   /**
+   * An "edit.format" request specified a file that contains syntax errors.
+   */
+  static const FORMAT_WITH_ERRORS = const RequestErrorCode._("FORMAT_WITH_ERRORS");
+
+  /**
    * An "analysis.getErrors" request specified a FilePath which does not match
    * a file currently subject to analysis.
    */
@@ -9491,7 +12238,7 @@
   /**
    * A list containing all of the enum values that are defined.
    */
-  static const List<RequestErrorCode> VALUES = const <RequestErrorCode>[CONTENT_MODIFIED, FORMAT_INVALID_FILE, GET_ERRORS_INVALID_FILE, INVALID_ANALYSIS_ROOT, INVALID_EXECUTION_CONTEXT, INVALID_OVERLAY_CHANGE, INVALID_PARAMETER, INVALID_REQUEST, NO_INDEX_GENERATED, REFACTORING_REQUEST_CANCELLED, SERVER_ALREADY_STARTED, SERVER_ERROR, SORT_MEMBERS_INVALID_FILE, SORT_MEMBERS_PARSE_ERRORS, UNANALYZED_PRIORITY_FILES, UNKNOWN_REQUEST, UNKNOWN_SOURCE, UNSUPPORTED_FEATURE];
+  static const List<RequestErrorCode> VALUES = const <RequestErrorCode>[CONTENT_MODIFIED, FORMAT_INVALID_FILE, FORMAT_WITH_ERRORS, GET_ERRORS_INVALID_FILE, INVALID_ANALYSIS_ROOT, INVALID_EXECUTION_CONTEXT, INVALID_OVERLAY_CHANGE, INVALID_PARAMETER, INVALID_REQUEST, NO_INDEX_GENERATED, REFACTORING_REQUEST_CANCELLED, SERVER_ALREADY_STARTED, SERVER_ERROR, SORT_MEMBERS_INVALID_FILE, SORT_MEMBERS_PARSE_ERRORS, UNANALYZED_PRIORITY_FILES, UNKNOWN_REQUEST, UNKNOWN_SOURCE, UNSUPPORTED_FEATURE];
 
   final String name;
 
@@ -9503,6 +12250,8 @@
         return CONTENT_MODIFIED;
       case "FORMAT_INVALID_FILE":
         return FORMAT_INVALID_FILE;
+      case "FORMAT_WITH_ERRORS":
+        return FORMAT_WITH_ERRORS;
       case "GET_ERRORS_INVALID_FILE":
         return GET_ERRORS_INVALID_FILE;
       case "INVALID_ANALYSIS_ROOT":
@@ -9567,16 +12316,41 @@
  * }
  */
 class SearchResult implements HasToJson {
+  Location _location;
+
+  SearchResultKind _kind;
+
+  bool _isPotential;
+
+  List<Element> _path;
+
   /**
    * The location of the code that matched the search criteria.
    */
-  Location location;
+  Location get location => _location;
+
+  /**
+   * The location of the code that matched the search criteria.
+   */
+  void set location(Location value) {
+    assert(value != null);
+    this._location = value;
+  }
 
   /**
    * The kind of element that was found or the kind of reference that was
    * found.
    */
-  SearchResultKind kind;
+  SearchResultKind get kind => _kind;
+
+  /**
+   * The kind of element that was found or the kind of reference that was
+   * found.
+   */
+  void set kind(SearchResultKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
 
   /**
    * True if the result is a potential match but cannot be confirmed to be a
@@ -9584,15 +12358,40 @@
    * were requested, and a reference to a method m from an unknown class were
    * found, it would be marked as being a potential match.
    */
-  bool isPotential;
+  bool get isPotential => _isPotential;
+
+  /**
+   * True if the result is a potential match but cannot be confirmed to be a
+   * match. For example, if all references to a method m defined in some class
+   * were requested, and a reference to a method m from an unknown class were
+   * found, it would be marked as being a potential match.
+   */
+  void set isPotential(bool value) {
+    assert(value != null);
+    this._isPotential = value;
+  }
 
   /**
    * The elements that contain the result, starting with the most immediately
    * enclosing ancestor and ending with the library.
    */
-  List<Element> path;
+  List<Element> get path => _path;
 
-  SearchResult(this.location, this.kind, this.isPotential, this.path);
+  /**
+   * The elements that contain the result, starting with the most immediately
+   * enclosing ancestor and ending with the library.
+   */
+  void set path(List<Element> value) {
+    assert(value != null);
+    this._path = value;
+  }
+
+  SearchResult(Location location, SearchResultKind kind, bool isPotential, List<Element> path) {
+    this.location = location;
+    this.kind = kind;
+    this.isPotential = isPotential;
+    this.path = path;
+  }
 
   factory SearchResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -9814,34 +12613,80 @@
  * }
  */
 class SourceChange implements HasToJson {
+  String _message;
+
+  List<SourceFileEdit> _edits;
+
+  List<LinkedEditGroup> _linkedEditGroups;
+
+  Position _selection;
+
   /**
    * A human-readable description of the change to be applied.
    */
-  String message;
+  String get message => _message;
+
+  /**
+   * A human-readable description of the change to be applied.
+   */
+  void set message(String value) {
+    assert(value != null);
+    this._message = value;
+  }
 
   /**
    * A list of the edits used to effect the change, grouped by file.
    */
-  List<SourceFileEdit> edits;
+  List<SourceFileEdit> get edits => _edits;
+
+  /**
+   * A list of the edits used to effect the change, grouped by file.
+   */
+  void set edits(List<SourceFileEdit> value) {
+    assert(value != null);
+    this._edits = value;
+  }
 
   /**
    * A list of the linked editing groups used to customize the changes that
    * were made.
    */
-  List<LinkedEditGroup> linkedEditGroups;
+  List<LinkedEditGroup> get linkedEditGroups => _linkedEditGroups;
+
+  /**
+   * A list of the linked editing groups used to customize the changes that
+   * were made.
+   */
+  void set linkedEditGroups(List<LinkedEditGroup> value) {
+    assert(value != null);
+    this._linkedEditGroups = value;
+  }
 
   /**
    * The position that should be selected after the edits have been applied.
    */
-  Position selection;
+  Position get selection => _selection;
 
-  SourceChange(this.message, {this.edits, this.linkedEditGroups, this.selection}) {
+  /**
+   * The position that should be selected after the edits have been applied.
+   */
+  void set selection(Position value) {
+    this._selection = value;
+  }
+
+  SourceChange(String message, {List<SourceFileEdit> edits, List<LinkedEditGroup> linkedEditGroups, Position selection}) {
+    this.message = message;
     if (edits == null) {
-      edits = <SourceFileEdit>[];
+      this.edits = <SourceFileEdit>[];
+    } else {
+      this.edits = edits;
     }
     if (linkedEditGroups == null) {
-      linkedEditGroups = <LinkedEditGroup>[];
+      this.linkedEditGroups = <LinkedEditGroup>[];
+    } else {
+      this.linkedEditGroups = linkedEditGroups;
     }
+    this.selection = selection;
   }
 
   factory SourceChange.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
@@ -9957,20 +12802,52 @@
   static String applySequence(String code, Iterable<SourceEdit> edits) =>
       _applySequence(code, edits);
 
+  int _offset;
+
+  int _length;
+
+  String _replacement;
+
+  String _id;
+
   /**
    * The offset of the region to be modified.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset of the region to be modified.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the region to be modified.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the region to be modified.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The code that is to replace the specified region in the original code.
    */
-  String replacement;
+  String get replacement => _replacement;
+
+  /**
+   * The code that is to replace the specified region in the original code.
+   */
+  void set replacement(String value) {
+    assert(value != null);
+    this._replacement = value;
+  }
 
   /**
    * An identifier that uniquely identifies this source edit from other edits
@@ -9982,9 +12859,28 @@
    * id so that they can be referenced. Edits in the same response that do not
    * need to be referenced will not have an id.
    */
-  String id;
+  String get id => _id;
 
-  SourceEdit(this.offset, this.length, this.replacement, {this.id});
+  /**
+   * An identifier that uniquely identifies this source edit from other edits
+   * in the same response. This field is omitted unless a containing structure
+   * needs to be able to identify the edit for some reason.
+   *
+   * For example, some refactoring operations can produce edits that might not
+   * be appropriate (referred to as potential edits). Such edits will have an
+   * id so that they can be referenced. Edits in the same response that do not
+   * need to be referenced will not have an id.
+   */
+  void set id(String value) {
+    this._id = value;
+  }
+
+  SourceEdit(int offset, int length, String replacement, {String id}) {
+    this.offset = offset;
+    this.length = length;
+    this.replacement = replacement;
+    this.id = id;
+  }
 
   factory SourceEdit.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10075,10 +12971,24 @@
  * }
  */
 class SourceFileEdit implements HasToJson {
+  String _file;
+
+  int _fileStamp;
+
+  List<SourceEdit> _edits;
+
   /**
    * The file containing the code to be modified.
    */
-  String file;
+  String get file => _file;
+
+  /**
+   * The file containing the code to be modified.
+   */
+  void set file(String value) {
+    assert(value != null);
+    this._file = value;
+  }
 
   /**
    * The modification stamp of the file at the moment when the change was
@@ -10087,16 +12997,40 @@
    * sure that the file was not changed since then, so it is safe to apply the
    * change.
    */
-  int fileStamp;
+  int get fileStamp => _fileStamp;
+
+  /**
+   * The modification stamp of the file at the moment when the change was
+   * created, in milliseconds since the "Unix epoch". Will be -1 if the file
+   * did not exist and should be created. The client may use this field to make
+   * sure that the file was not changed since then, so it is safe to apply the
+   * change.
+   */
+  void set fileStamp(int value) {
+    assert(value != null);
+    this._fileStamp = value;
+  }
 
   /**
    * A list of the edits used to effect the change.
    */
-  List<SourceEdit> edits;
+  List<SourceEdit> get edits => _edits;
 
-  SourceFileEdit(this.file, this.fileStamp, {this.edits}) {
+  /**
+   * A list of the edits used to effect the change.
+   */
+  void set edits(List<SourceEdit> value) {
+    assert(value != null);
+    this._edits = value;
+  }
+
+  SourceFileEdit(String file, int fileStamp, {List<SourceEdit> edits}) {
+    this.file = file;
+    this.fileStamp = fileStamp;
     if (edits == null) {
-      edits = <SourceEdit>[];
+      this.edits = <SourceEdit>[];
+    } else {
+      this.edits = edits;
     }
   }
 
@@ -10185,10 +13119,32 @@
  * }
  */
 class TypeHierarchyItem implements HasToJson {
+  Element _classElement;
+
+  String _displayName;
+
+  Element _memberElement;
+
+  int _superclass;
+
+  List<int> _interfaces;
+
+  List<int> _mixins;
+
+  List<int> _subclasses;
+
   /**
    * The class element represented by this item.
    */
-  Element classElement;
+  Element get classElement => _classElement;
+
+  /**
+   * The class element represented by this item.
+   */
+  void set classElement(Element value) {
+    assert(value != null);
+    this._classElement = value;
+  }
 
   /**
    * The name to be displayed for the class. This field will be omitted if the
@@ -10196,7 +13152,17 @@
    * different if there is additional type information to be displayed, such as
    * type arguments.
    */
-  String displayName;
+  String get displayName => _displayName;
+
+  /**
+   * The name to be displayed for the class. This field will be omitted if the
+   * display name is the same as the name of the element. The display name is
+   * different if there is additional type information to be displayed, such as
+   * type arguments.
+   */
+  void set displayName(String value) {
+    this._displayName = value;
+  }
 
   /**
    * The member in the class corresponding to the member on which the hierarchy
@@ -10204,42 +13170,98 @@
    * requested for a member or if the class does not have a corresponding
    * member.
    */
-  Element memberElement;
+  Element get memberElement => _memberElement;
+
+  /**
+   * The member in the class corresponding to the member on which the hierarchy
+   * was requested. This field will be omitted if the hierarchy was not
+   * requested for a member or if the class does not have a corresponding
+   * member.
+   */
+  void set memberElement(Element value) {
+    this._memberElement = value;
+  }
 
   /**
    * The index of the item representing the superclass of this class. This
    * field will be omitted if this item represents the class Object.
    */
-  int superclass;
+  int get superclass => _superclass;
+
+  /**
+   * The index of the item representing the superclass of this class. This
+   * field will be omitted if this item represents the class Object.
+   */
+  void set superclass(int value) {
+    this._superclass = value;
+  }
 
   /**
    * The indexes of the items representing the interfaces implemented by this
    * class. The list will be empty if there are no implemented interfaces.
    */
-  List<int> interfaces;
+  List<int> get interfaces => _interfaces;
+
+  /**
+   * The indexes of the items representing the interfaces implemented by this
+   * class. The list will be empty if there are no implemented interfaces.
+   */
+  void set interfaces(List<int> value) {
+    assert(value != null);
+    this._interfaces = value;
+  }
 
   /**
    * The indexes of the items representing the mixins referenced by this class.
    * The list will be empty if there are no classes mixed in to this class.
    */
-  List<int> mixins;
+  List<int> get mixins => _mixins;
+
+  /**
+   * The indexes of the items representing the mixins referenced by this class.
+   * The list will be empty if there are no classes mixed in to this class.
+   */
+  void set mixins(List<int> value) {
+    assert(value != null);
+    this._mixins = value;
+  }
 
   /**
    * The indexes of the items representing the subtypes of this class. The list
    * will be empty if there are no subtypes or if this item represents a
    * supertype of the pivot type.
    */
-  List<int> subclasses;
+  List<int> get subclasses => _subclasses;
 
-  TypeHierarchyItem(this.classElement, {this.displayName, this.memberElement, this.superclass, this.interfaces, this.mixins, this.subclasses}) {
+  /**
+   * The indexes of the items representing the subtypes of this class. The list
+   * will be empty if there are no subtypes or if this item represents a
+   * supertype of the pivot type.
+   */
+  void set subclasses(List<int> value) {
+    assert(value != null);
+    this._subclasses = value;
+  }
+
+  TypeHierarchyItem(Element classElement, {String displayName, Element memberElement, int superclass, List<int> interfaces, List<int> mixins, List<int> subclasses}) {
+    this.classElement = classElement;
+    this.displayName = displayName;
+    this.memberElement = memberElement;
+    this.superclass = superclass;
     if (interfaces == null) {
-      interfaces = <int>[];
+      this.interfaces = <int>[];
+    } else {
+      this.interfaces = interfaces;
     }
     if (mixins == null) {
-      mixins = <int>[];
+      this.mixins = <int>[];
+    } else {
+      this.mixins = mixins;
     }
     if (subclasses == null) {
-      subclasses = <int>[];
+      this.subclasses = <int>[];
+    } else {
+      this.subclasses = subclasses;
     }
   }
 
@@ -10417,16 +13439,39 @@
  * }
  */
 class ExtractLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
+  List<String> _names;
+
+  List<int> _offsets;
+
+  List<int> _lengths;
+
   /**
    * The proposed names for the local variable.
    */
-  List<String> names;
+  List<String> get names => _names;
+
+  /**
+   * The proposed names for the local variable.
+   */
+  void set names(List<String> value) {
+    assert(value != null);
+    this._names = value;
+  }
 
   /**
    * The offsets of the expressions that would be replaced by a reference to
    * the variable.
    */
-  List<int> offsets;
+  List<int> get offsets => _offsets;
+
+  /**
+   * The offsets of the expressions that would be replaced by a reference to
+   * the variable.
+   */
+  void set offsets(List<int> value) {
+    assert(value != null);
+    this._offsets = value;
+  }
 
   /**
    * The lengths of the expressions that would be replaced by a reference to
@@ -10434,9 +13479,24 @@
    * given expression, if the offset of that expression is offsets[i], then the
    * length of that expression is lengths[i].
    */
-  List<int> lengths;
+  List<int> get lengths => _lengths;
 
-  ExtractLocalVariableFeedback(this.names, this.offsets, this.lengths);
+  /**
+   * The lengths of the expressions that would be replaced by a reference to
+   * the variable. The lengths correspond to the offsets. In other words, for a
+   * given expression, if the offset of that expression is offsets[i], then the
+   * length of that expression is lengths[i].
+   */
+  void set lengths(List<int> value) {
+    assert(value != null);
+    this._lengths = value;
+  }
+
+  ExtractLocalVariableFeedback(List<String> names, List<int> offsets, List<int> lengths) {
+    this.names = names;
+    this.offsets = offsets;
+    this.lengths = lengths;
+  }
 
   factory ExtractLocalVariableFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10507,10 +13567,22 @@
  * }
  */
 class ExtractLocalVariableOptions extends RefactoringOptions implements HasToJson {
+  String _name;
+
+  bool _extractAll;
+
   /**
    * The name that the local variable should be given.
    */
-  String name;
+  String get name => _name;
+
+  /**
+   * The name that the local variable should be given.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
 
   /**
    * True if all occurrences of the expression within the scope in which the
@@ -10518,9 +13590,23 @@
    * variable. The expression used to initiate the refactoring will always be
    * replaced.
    */
-  bool extractAll;
+  bool get extractAll => _extractAll;
 
-  ExtractLocalVariableOptions(this.name, this.extractAll);
+  /**
+   * True if all occurrences of the expression within the scope in which the
+   * variable will be defined should be replaced by a reference to the local
+   * variable. The expression used to initiate the refactoring will always be
+   * replaced.
+   */
+  void set extractAll(bool value) {
+    assert(value != null);
+    this._extractAll = value;
+  }
+
+  ExtractLocalVariableOptions(String name, bool extractAll) {
+    this.name = name;
+    this.extractAll = extractAll;
+  }
 
   factory ExtractLocalVariableOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10593,43 +13679,118 @@
  * }
  */
 class ExtractMethodFeedback extends RefactoringFeedback implements HasToJson {
+  int _offset;
+
+  int _length;
+
+  String _returnType;
+
+  List<String> _names;
+
+  bool _canCreateGetter;
+
+  List<RefactoringMethodParameter> _parameters;
+
+  List<int> _offsets;
+
+  List<int> _lengths;
+
   /**
    * The offset to the beginning of the expression or statements that will be
    * extracted.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset to the beginning of the expression or statements that will be
+   * extracted.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the expression or statements that will be extracted.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the expression or statements that will be extracted.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The proposed return type for the method. If the returned element does not
    * have a declared return type, this field will contain an empty string.
    */
-  String returnType;
+  String get returnType => _returnType;
+
+  /**
+   * The proposed return type for the method. If the returned element does not
+   * have a declared return type, this field will contain an empty string.
+   */
+  void set returnType(String value) {
+    assert(value != null);
+    this._returnType = value;
+  }
 
   /**
    * The proposed names for the method.
    */
-  List<String> names;
+  List<String> get names => _names;
+
+  /**
+   * The proposed names for the method.
+   */
+  void set names(List<String> value) {
+    assert(value != null);
+    this._names = value;
+  }
 
   /**
    * True if a getter could be created rather than a method.
    */
-  bool canCreateGetter;
+  bool get canCreateGetter => _canCreateGetter;
+
+  /**
+   * True if a getter could be created rather than a method.
+   */
+  void set canCreateGetter(bool value) {
+    assert(value != null);
+    this._canCreateGetter = value;
+  }
 
   /**
    * The proposed parameters for the method.
    */
-  List<RefactoringMethodParameter> parameters;
+  List<RefactoringMethodParameter> get parameters => _parameters;
+
+  /**
+   * The proposed parameters for the method.
+   */
+  void set parameters(List<RefactoringMethodParameter> value) {
+    assert(value != null);
+    this._parameters = value;
+  }
 
   /**
    * The offsets of the expressions or statements that would be replaced by an
    * invocation of the method.
    */
-  List<int> offsets;
+  List<int> get offsets => _offsets;
+
+  /**
+   * The offsets of the expressions or statements that would be replaced by an
+   * invocation of the method.
+   */
+  void set offsets(List<int> value) {
+    assert(value != null);
+    this._offsets = value;
+  }
 
   /**
    * The lengths of the expressions or statements that would be replaced by an
@@ -10638,9 +13799,30 @@
    * that expression is offsets[i], then the length of that expression is
    * lengths[i].
    */
-  List<int> lengths;
+  List<int> get lengths => _lengths;
 
-  ExtractMethodFeedback(this.offset, this.length, this.returnType, this.names, this.canCreateGetter, this.parameters, this.offsets, this.lengths);
+  /**
+   * The lengths of the expressions or statements that would be replaced by an
+   * invocation of the method. The lengths correspond to the offsets. In other
+   * words, for a given expression (or block of statements), if the offset of
+   * that expression is offsets[i], then the length of that expression is
+   * lengths[i].
+   */
+  void set lengths(List<int> value) {
+    assert(value != null);
+    this._lengths = value;
+  }
+
+  ExtractMethodFeedback(int offset, int length, String returnType, List<String> names, bool canCreateGetter, List<RefactoringMethodParameter> parameters, List<int> offsets, List<int> lengths) {
+    this.offset = offset;
+    this.length = length;
+    this.returnType = returnType;
+    this.names = names;
+    this.canCreateGetter = canCreateGetter;
+    this.parameters = parameters;
+    this.offsets = offsets;
+    this.lengths = lengths;
+  }
 
   factory ExtractMethodFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10759,21 +13941,56 @@
  * }
  */
 class ExtractMethodOptions extends RefactoringOptions implements HasToJson {
+  String _returnType;
+
+  bool _createGetter;
+
+  String _name;
+
+  List<RefactoringMethodParameter> _parameters;
+
+  bool _extractAll;
+
   /**
    * The return type that should be defined for the method.
    */
-  String returnType;
+  String get returnType => _returnType;
+
+  /**
+   * The return type that should be defined for the method.
+   */
+  void set returnType(String value) {
+    assert(value != null);
+    this._returnType = value;
+  }
 
   /**
    * True if a getter should be created rather than a method. It is an error if
    * this field is true and the list of parameters is non-empty.
    */
-  bool createGetter;
+  bool get createGetter => _createGetter;
+
+  /**
+   * True if a getter should be created rather than a method. It is an error if
+   * this field is true and the list of parameters is non-empty.
+   */
+  void set createGetter(bool value) {
+    assert(value != null);
+    this._createGetter = value;
+  }
 
   /**
    * The name that the method should be given.
    */
-  String name;
+  String get name => _name;
+
+  /**
+   * The name that the method should be given.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
 
   /**
    * The parameters that should be defined for the method.
@@ -10787,16 +14004,49 @@
    * - To add new parameters, omit their identifier.
    * - To remove some parameters, omit them in this list.
    */
-  List<RefactoringMethodParameter> parameters;
+  List<RefactoringMethodParameter> get parameters => _parameters;
+
+  /**
+   * The parameters that should be defined for the method.
+   *
+   * It is an error if a REQUIRED or NAMED parameter follows a POSITIONAL
+   * parameter. It is an error if a REQUIRED or POSITIONAL parameter follows a
+   * NAMED parameter.
+   *
+   * - To change the order and/or update proposed parameters, add parameters
+   *   with the same identifiers as proposed.
+   * - To add new parameters, omit their identifier.
+   * - To remove some parameters, omit them in this list.
+   */
+  void set parameters(List<RefactoringMethodParameter> value) {
+    assert(value != null);
+    this._parameters = value;
+  }
 
   /**
    * True if all occurrences of the expression or statements should be replaced
    * by an invocation of the method. The expression or statements used to
    * initiate the refactoring will always be replaced.
    */
-  bool extractAll;
+  bool get extractAll => _extractAll;
 
-  ExtractMethodOptions(this.returnType, this.createGetter, this.name, this.parameters, this.extractAll);
+  /**
+   * True if all occurrences of the expression or statements should be replaced
+   * by an invocation of the method. The expression or statements used to
+   * initiate the refactoring will always be replaced.
+   */
+  void set extractAll(bool value) {
+    assert(value != null);
+    this._extractAll = value;
+  }
+
+  ExtractMethodOptions(String returnType, bool createGetter, String name, List<RefactoringMethodParameter> parameters, bool extractAll) {
+    this.returnType = returnType;
+    this.createGetter = createGetter;
+    this.name = name;
+    this.parameters = parameters;
+    this.extractAll = extractAll;
+  }
 
   factory ExtractMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10890,17 +14140,40 @@
  * }
  */
 class InlineLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
+  String _name;
+
+  int _occurrences;
+
   /**
    * The name of the variable being inlined.
    */
-  String name;
+  String get name => _name;
+
+  /**
+   * The name of the variable being inlined.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
 
   /**
    * The number of times the variable occurs.
    */
-  int occurrences;
+  int get occurrences => _occurrences;
 
-  InlineLocalVariableFeedback(this.name, this.occurrences);
+  /**
+   * The number of times the variable occurs.
+   */
+  void set occurrences(int value) {
+    assert(value != null);
+    this._occurrences = value;
+  }
+
+  InlineLocalVariableFeedback(String name, int occurrences) {
+    this.name = name;
+    this.occurrences = occurrences;
+  }
 
   factory InlineLocalVariableFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -10980,24 +14253,59 @@
  * }
  */
 class InlineMethodFeedback extends RefactoringFeedback implements HasToJson {
+  String _className;
+
+  String _methodName;
+
+  bool _isDeclaration;
+
   /**
    * The name of the class enclosing the method being inlined. If not a class
    * member is being inlined, this field will be absent.
    */
-  String className;
+  String get className => _className;
+
+  /**
+   * The name of the class enclosing the method being inlined. If not a class
+   * member is being inlined, this field will be absent.
+   */
+  void set className(String value) {
+    this._className = value;
+  }
 
   /**
    * The name of the method (or function) being inlined.
    */
-  String methodName;
+  String get methodName => _methodName;
+
+  /**
+   * The name of the method (or function) being inlined.
+   */
+  void set methodName(String value) {
+    assert(value != null);
+    this._methodName = value;
+  }
 
   /**
    * True if the declaration of the method is selected. So all references
    * should be inlined.
    */
-  bool isDeclaration;
+  bool get isDeclaration => _isDeclaration;
 
-  InlineMethodFeedback(this.methodName, this.isDeclaration, {this.className});
+  /**
+   * True if the declaration of the method is selected. So all references
+   * should be inlined.
+   */
+  void set isDeclaration(bool value) {
+    assert(value != null);
+    this._isDeclaration = value;
+  }
+
+  InlineMethodFeedback(String methodName, bool isDeclaration, {String className}) {
+    this.className = className;
+    this.methodName = methodName;
+    this.isDeclaration = isDeclaration;
+  }
 
   factory InlineMethodFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -11068,19 +14376,44 @@
  * }
  */
 class InlineMethodOptions extends RefactoringOptions implements HasToJson {
+  bool _deleteSource;
+
+  bool _inlineAll;
+
   /**
    * True if the method being inlined should be removed. It is an error if this
    * field is true and inlineAll is false.
    */
-  bool deleteSource;
+  bool get deleteSource => _deleteSource;
+
+  /**
+   * True if the method being inlined should be removed. It is an error if this
+   * field is true and inlineAll is false.
+   */
+  void set deleteSource(bool value) {
+    assert(value != null);
+    this._deleteSource = value;
+  }
 
   /**
    * True if all invocations of the method should be inlined, or false if only
    * the invocation site used to create this refactoring should be inlined.
    */
-  bool inlineAll;
+  bool get inlineAll => _inlineAll;
 
-  InlineMethodOptions(this.deleteSource, this.inlineAll);
+  /**
+   * True if all invocations of the method should be inlined, or false if only
+   * the invocation site used to create this refactoring should be inlined.
+   */
+  void set inlineAll(bool value) {
+    assert(value != null);
+    this._inlineAll = value;
+  }
+
+  InlineMethodOptions(bool deleteSource, bool inlineAll) {
+    this.deleteSource = deleteSource;
+    this.inlineAll = inlineAll;
+  }
 
   factory InlineMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -11163,12 +14496,24 @@
  * }
  */
 class MoveFileOptions extends RefactoringOptions implements HasToJson {
+  String _newFile;
+
   /**
    * The new file path to which the given file is being moved.
    */
-  String newFile;
+  String get newFile => _newFile;
 
-  MoveFileOptions(this.newFile);
+  /**
+   * The new file path to which the given file is being moved.
+   */
+  void set newFile(String value) {
+    assert(value != null);
+    this._newFile = value;
+  }
+
+  MoveFileOptions(String newFile) {
+    this.newFile = newFile;
+  }
 
   factory MoveFileOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -11228,28 +14573,74 @@
  * }
  */
 class RenameFeedback extends RefactoringFeedback implements HasToJson {
+  int _offset;
+
+  int _length;
+
+  String _elementKindName;
+
+  String _oldName;
+
   /**
    * The offset to the beginning of the name selected to be renamed.
    */
-  int offset;
+  int get offset => _offset;
+
+  /**
+   * The offset to the beginning of the name selected to be renamed.
+   */
+  void set offset(int value) {
+    assert(value != null);
+    this._offset = value;
+  }
 
   /**
    * The length of the name selected to be renamed.
    */
-  int length;
+  int get length => _length;
+
+  /**
+   * The length of the name selected to be renamed.
+   */
+  void set length(int value) {
+    assert(value != null);
+    this._length = value;
+  }
 
   /**
    * The human-readable description of the kind of element being renamed (such
    * as “class” or “function type alias”).
    */
-  String elementKindName;
+  String get elementKindName => _elementKindName;
+
+  /**
+   * The human-readable description of the kind of element being renamed (such
+   * as “class” or “function type alias”).
+   */
+  void set elementKindName(String value) {
+    assert(value != null);
+    this._elementKindName = value;
+  }
 
   /**
    * The old name of the element before the refactoring.
    */
-  String oldName;
+  String get oldName => _oldName;
 
-  RenameFeedback(this.offset, this.length, this.elementKindName, this.oldName);
+  /**
+   * The old name of the element before the refactoring.
+   */
+  void set oldName(String value) {
+    assert(value != null);
+    this._oldName = value;
+  }
+
+  RenameFeedback(int offset, int length, String elementKindName, String oldName) {
+    this.offset = offset;
+    this.length = length;
+    this.elementKindName = elementKindName;
+    this.oldName = oldName;
+  }
 
   factory RenameFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -11328,12 +14719,24 @@
  * }
  */
 class RenameOptions extends RefactoringOptions implements HasToJson {
+  String _newName;
+
   /**
    * The name that the element should have after the refactoring.
    */
-  String newName;
+  String get newName => _newName;
 
-  RenameOptions(this.newName);
+  /**
+   * The name that the element should have after the refactoring.
+   */
+  void set newName(String value) {
+    assert(value != null);
+    this._newName = value;
+  }
+
+  RenameOptions(String newName) {
+    this.newName = newName;
+  }
 
   factory RenameOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
diff --git a/dart/pkg/analysis_server/lib/src/get_handler.dart b/dart/pkg/analysis_server/lib/src/get_handler.dart
index 14d18cd..776f38a 100644
--- a/dart/pkg/analysis_server/lib/src/get_handler.dart
+++ b/dart/pkg/analysis_server/lib/src/get_handler.dart
@@ -10,7 +10,6 @@
 import 'dart:io';
 import 'dart:math';
 
-import 'package:analyzer/plugin/plugin.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/domain_execution.dart';
@@ -31,8 +30,7 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
-
-import 'analysis_server.dart';
+import 'package:plugin/plugin.dart';
 
 /**
  * A function that can be used to generate HTML output into the given [buffer].
diff --git a/dart/pkg/analysis_server/lib/src/plugin/server_plugin.dart b/dart/pkg/analysis_server/lib/src/plugin/server_plugin.dart
index b74fb7f..6aed910 100644
--- a/dart/pkg/analysis_server/lib/src/plugin/server_plugin.dart
+++ b/dart/pkg/analysis_server/lib/src/plugin/server_plugin.dart
@@ -4,6 +4,13 @@
 
 library analysis_server.src.plugin.server_plugin;
 
+import 'package:analysis_server/analysis/index/index_core.dart';
+import 'package:analysis_server/completion/completion_core.dart';
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analysis_server/edit/fix/fix_core.dart';
+import 'package:analysis_server/plugin/assist.dart';
+//import 'package:analysis_server/plugin/completion.dart';
+import 'package:analysis_server/plugin/fix.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_completion.dart';
@@ -12,7 +19,9 @@
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/search/search_domain.dart';
-import 'package:analyzer/plugin/plugin.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:plugin/plugin.dart';
 
 /**
  * A function that will create a request handler that can be used by the given
@@ -27,26 +36,102 @@
 class ServerPlugin implements Plugin {
   /**
    * The simple identifier of the extension point that allows plugins to
+   * register new assist contributors with the server.
+   */
+  static const String ASSIST_CONTRIBUTOR_EXTENSION_POINT = 'assistContributor';
+
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new completion contributors with the server.
+   */
+  static const String COMPLETION_CONTRIBUTOR_EXTENSION_POINT =
+      'completionContributor';
+
+  /**
+   * The simple identifier of the extension point that allows plugins to
    * register new domains with the server.
    */
   static const String DOMAIN_EXTENSION_POINT = 'domain';
 
   /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new fix contributors with the server.
+   */
+  static const String FIX_CONTRIBUTOR_EXTENSION_POINT = 'fixContributor';
+
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new index contributors with the server.
+   */
+  static const String INDEX_CONTRIBUTOR_EXTENSION_POINT = 'indexContributor';
+
+  /**
    * The unique identifier of this plugin.
    */
   static const String UNIQUE_IDENTIFIER = 'analysis_server.core';
 
   /**
+   * The extension point that allows plugins to register new assist contributors
+   * with the server.
+   */
+  ExtensionPoint assistContributorExtensionPoint;
+
+  /**
+   * The extension point that allows plugins to register new completion
+   * contributors with the server.
+   */
+  ExtensionPoint completionContributorExtensionPoint;
+
+  /**
    * The extension point that allows plugins to register new domains with the
    * server.
    */
   ExtensionPoint domainExtensionPoint;
 
   /**
+   * The extension point that allows plugins to register new fix contributors
+   * with the server.
+   */
+  ExtensionPoint fixContributorExtensionPoint;
+
+  /**
+   * The extension point that allows plugins to register new index contributors
+   * with the server.
+   */
+  ExtensionPoint indexContributorExtensionPoint;
+
+  /**
    * Initialize a newly created plugin.
    */
   ServerPlugin();
 
+  /**
+   * Return a list containing all of the assist contributors that were
+   * contributed.
+   */
+  List<AssistContributor> get assistContributors =>
+      assistContributorExtensionPoint.extensions;
+
+  /**
+   * Return a list containing all of the completion contributors that were
+   * contributed.
+   */
+  List<CompletionContributor> get completionContributors =>
+      completionContributorExtensionPoint.extensions;
+
+  /**
+   * Return a list containing all of the fix contributors that were contributed.
+   */
+  List<FixContributor> get fixContributors =>
+      fixContributorExtensionPoint.extensions;
+
+  /**
+   * Return a list containing all of the index contributors that were
+   * contributed.
+   */
+  List<IndexContributor> get indexContributor =>
+      indexContributorExtensionPoint.extensions;
+
   @override
   String get uniqueIdentifier => UNIQUE_IDENTIFIER;
 
@@ -65,25 +150,82 @@
 
   @override
   void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    assistContributorExtensionPoint = registerExtensionPoint(
+        ASSIST_CONTRIBUTOR_EXTENSION_POINT,
+        _validateAssistContributorExtension);
+    completionContributorExtensionPoint = registerExtensionPoint(
+        COMPLETION_CONTRIBUTOR_EXTENSION_POINT,
+        _validateCompletionContributorExtension);
     domainExtensionPoint = registerExtensionPoint(
         DOMAIN_EXTENSION_POINT, _validateDomainExtension);
+    fixContributorExtensionPoint = registerExtensionPoint(
+        FIX_CONTRIBUTOR_EXTENSION_POINT, _validateFixContributorExtension);
+    indexContributorExtensionPoint = registerExtensionPoint(
+        INDEX_CONTRIBUTOR_EXTENSION_POINT, _validateIndexContributorExtension);
   }
 
   @override
   void registerExtensions(RegisterExtension registerExtension) {
+    //
+    // Register assist contributors.
+    //
+    registerExtension(
+        ASSIST_CONTRIBUTOR_EXTENSION_POINT_ID, new DefaultAssistContributor());
+    //
+    // Register completion contributors.
+    //
+    // TODO(brianwilkerson) Register the completion contributors.
+//    registerExtension(COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID, ???);
+    //
+    // Register domains.
+    //
     String domainId = Plugin.join(UNIQUE_IDENTIFIER, DOMAIN_EXTENSION_POINT);
     registerExtension(
         domainId, (AnalysisServer server) => new ServerDomainHandler(server));
     registerExtension(
         domainId, (AnalysisServer server) => new AnalysisDomainHandler(server));
-    registerExtension(
-        domainId, (AnalysisServer server) => new EditDomainHandler(server));
+    registerExtension(domainId,
+        (AnalysisServer server) => new EditDomainHandler(server, this));
     registerExtension(
         domainId, (AnalysisServer server) => new SearchDomainHandler(server));
     registerExtension(domainId,
         (AnalysisServer server) => new CompletionDomainHandler(server));
     registerExtension(domainId,
         (AnalysisServer server) => new ExecutionDomainHandler(server));
+    //
+    // Register fix contributors.
+    //
+    registerExtension(
+        FIX_CONTRIBUTOR_EXTENSION_POINT_ID, new DefaultFixContributor());
+    //
+    // Register index contributors.
+    //
+    // TODO(brianwilkerson) Register the index contributors.
+//    registerExtension(INDEX_CONTRIBUTOR_EXTENSION_POINT, ???);
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid assist contributor.
+   */
+  void _validateAssistContributorExtension(Object extension) {
+    if (extension is! AssistContributor) {
+      String id = assistContributorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be an AssistContributor');
+    }
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid completion contributor.
+   */
+  void _validateCompletionContributorExtension(Object extension) {
+    if (extension is! CompletionContributor) {
+      String id = completionContributorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be an CompletionContributor');
+    }
   }
 
   /**
@@ -97,4 +239,26 @@
           'Extensions to $id must be a RequestHandlerFactory');
     }
   }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid fix contributor.
+   */
+  void _validateFixContributorExtension(Object extension) {
+    if (extension is! FixContributor) {
+      String id = fixContributorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError('Extensions to $id must be a FixContributor');
+    }
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid index contributor.
+   */
+  void _validateIndexContributorExtension(Object extension) {
+    if (extension is! IndexContributor) {
+      String id = indexContributorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError('Extensions to $id must be an IndexContributor');
+    }
+  }
 }
diff --git a/dart/pkg/analysis_server/lib/src/protocol.dart b/dart/pkg/analysis_server/lib/src/protocol.dart
index bdc8608..a0854aa 100644
--- a/dart/pkg/analysis_server/lib/src/protocol.dart
+++ b/dart/pkg/analysis_server/lib/src/protocol.dart
@@ -690,14 +690,22 @@
       : _result = result;
 
   /**
-   * Initialize a newly created instance to represent the
-   * FORMAT_INVALID_FILE error condition.
+   * Initialize a newly created instance to represent the FORMAT_INVALID_FILE
+   * error condition.
    */
   Response.formatInvalidFile(Request request) : this(request.id,
           error: new RequestError(RequestErrorCode.FORMAT_INVALID_FILE,
               'Error during `edit.format`: invalid file.'));
 
   /**
+   * Initialize a newly created instance to represent the FORMAT_WITH_ERROR
+   * error condition.
+   */
+  Response.formatWithErrors(Request request) : this(request.id,
+          error: new RequestError(RequestErrorCode.FORMAT_WITH_ERRORS,
+              'Error during `edit.format`: source contains syntax errors.'));
+
+  /**
    * Initialize a newly created instance based upon the given JSON data
    */
   factory Response.fromJson(Map<String, Object> json) {
diff --git a/dart/pkg/analysis_server/lib/src/server/driver.dart b/dart/pkg/analysis_server/lib/src/server/driver.dart
index bc7c17b..0c1f9db 100644
--- a/dart/pkg/analysis_server/lib/src/server/driver.dart
+++ b/dart/pkg/analysis_server/lib/src/server/driver.dart
@@ -17,15 +17,14 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/file_instrumentation.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/options.dart';
-import 'package:analyzer/plugin/plugin.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/incremental_logger.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/plugin/plugin_impl.dart';
 import 'package:args/args.dart';
+import 'package:plugin/manager.dart';
+import 'package:plugin/plugin.dart';
 
 /**
  * Initializes incremental logger.
@@ -52,6 +51,130 @@
   }
 }
 
+/// Commandline argument parser. (Copied from analyzer/lib/options.dart)
+/// TODO(pquitslund): replaces with a simple [ArgParser] instance
+/// when the args package supports ignoring unrecognized
+/// options/flags (https://github.com/dart-lang/args/issues/9).
+class CommandLineParser {
+  final List<String> _knownFlags;
+  final bool _alwaysIgnoreUnrecognized;
+  final ArgParser _parser;
+
+  /// Creates a new command line parser
+  CommandLineParser({bool alwaysIgnoreUnrecognized: false})
+      : _knownFlags = <String>[],
+        _alwaysIgnoreUnrecognized = alwaysIgnoreUnrecognized,
+        _parser = new ArgParser(allowTrailingOptions: true);
+
+  ArgParser get parser => _parser;
+
+  /// Defines a flag.
+  /// See [ArgParser.addFlag()].
+  void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
+      bool negatable: true, void callback(bool value), bool hide: false}) {
+    _knownFlags.add(name);
+    _parser.addFlag(name,
+        abbr: abbr,
+        help: help,
+        defaultsTo: defaultsTo,
+        negatable: negatable,
+        callback: callback,
+        hide: hide);
+  }
+
+  /// Defines a value-taking option.
+  /// See [ArgParser.addOption()].
+  void addOption(String name, {String abbr, String help, List<String> allowed,
+      Map<String, String> allowedHelp, String defaultsTo, void callback(value),
+      bool allowMultiple: false}) {
+    _knownFlags.add(name);
+    _parser.addOption(name,
+        abbr: abbr,
+        help: help,
+        allowed: allowed,
+        allowedHelp: allowedHelp,
+        defaultsTo: defaultsTo,
+        callback: callback,
+        allowMultiple: allowMultiple);
+  }
+
+  /// Generates a string displaying usage information for the defined options.
+  /// See [ArgParser.usage].
+  String getUsage() => _parser.usage;
+
+  /// Parses [args], a list of command-line arguments, matches them against the
+  /// flags and options defined by this parser, and returns the result. The
+  /// values of any defined variables are captured in the given map.
+  /// See [ArgParser].
+  ArgResults parse(
+      List<String> args, Map<String, String> definedVariables) => _parser
+      .parse(_filterUnknowns(parseDefinedVariables(args, definedVariables)));
+
+  List<String> parseDefinedVariables(
+      List<String> args, Map<String, String> definedVariables) {
+    int count = args.length;
+    List<String> remainingArgs = <String>[];
+    for (int i = 0; i < count; i++) {
+      String arg = args[i];
+      if (arg == '--') {
+        while (i < count) {
+          remainingArgs.add(args[i++]);
+        }
+      } else if (arg.startsWith("-D")) {
+        definedVariables[arg.substring(2)] = args[++i];
+      } else {
+        remainingArgs.add(arg);
+      }
+    }
+    return remainingArgs;
+  }
+
+  List<String> _filterUnknowns(List<String> args) {
+
+    // Only filter args if the ignore flag is specified, or if
+    // _alwaysIgnoreUnrecognized was set to true
+    if (_alwaysIgnoreUnrecognized ||
+        args.contains('--ignore-unrecognized-flags')) {
+
+      // Filter all unrecognized flags and options.
+      List<String> filtered = <String>[];
+      for (int i = 0; i < args.length; ++i) {
+        String arg = args[i];
+        if (arg.startsWith('--') && arg.length > 2) {
+          String option = arg.substring(2);
+          // strip the last '=value'
+          int equalsOffset = option.lastIndexOf('=');
+          if (equalsOffset != -1) {
+            option = option.substring(0, equalsOffset);
+          }
+          // check the option
+          if (!_knownFlags.contains(option)) {
+            //"eat" params by advancing to the next flag/option
+            i = _getNextFlagIndex(args, i);
+          } else {
+            filtered.add(arg);
+          }
+        } else {
+          filtered.add(arg);
+        }
+      }
+
+      return filtered;
+    } else {
+      return args;
+    }
+  }
+
+  _getNextFlagIndex(args, i) {
+    for (; i < args.length; ++i) {
+      if (args[i].startsWith('--')) {
+        return i;
+      }
+    }
+    return i;
+  }
+}
+
 /**
  * The [Driver] class represents a single running instance of the analysis
  * server application.  It is responsible for parsing command line options
@@ -81,6 +204,26 @@
       "enable-incremental-resolution-api";
 
   /**
+   * The name of the option used to enable instrumentation.
+   */
+  static const String ENABLE_INSTRUMENTATION_OPTION = "enable-instrumentation";
+
+  /**
+   * The name of the option used to enable the use of the new task model.
+   */
+  static const String ENABLE_NEW_TASK_MODEL = "enable-new-task-model";
+
+  /**
+   * The name of the option used to set the file read mode.
+   */
+  static const String FILE_READ_MODE = "file-read-mode";
+
+  /**
+   * The name of the option used to print usage information.
+   */
+  static const String HELP_OPTION = "help";
+
+  /**
    * The name of the option used to describe the incremental resolution logger.
    */
   static const String INCREMENTAL_RESOLUTION_LOG = "incremental-resolution-log";
@@ -99,14 +242,10 @@
   static const String INSTRUMENTATION_LOG_FILE = "instrumentation-log-file";
 
   /**
-   * The name of the option used to enable instrumentation.
+   * The name of the option used to specify if [print] should print to the
+   * console instead of being intercepted.
    */
-  static const String ENABLE_INSTRUMENTATION_OPTION = "enable-instrumentation";
-
-  /**
-   * The name of the option used to print usage information.
-   */
-  static const String HELP_OPTION = "help";
+  static const String INTERNAL_DELAY_FREQUENCY = 'internal-delay-frequency';
 
   /**
    * The name of the option used to specify if [print] should print to the
@@ -115,10 +254,14 @@
   static const String INTERNAL_PRINT_TO_CONSOLE = "internal-print-to-console";
 
   /**
-   * The name of the option used to specify if [print] should print to the
-   * console instead of being intercepted.
+   * The name of the flag used to disable error notifications.
    */
-  static const String INTERNAL_DELAY_FREQUENCY = 'internal-delay-frequency';
+  static const String NO_ERROR_NOTIFICATION = "no-error-notification";
+
+  /**
+   * The name of the flag used to disable the index.
+   */
+  static const String NO_INDEX = "no-index";
 
   /**
    * The option for specifying the http diagnostic port.
@@ -135,21 +278,6 @@
   static const String SDK_OPTION = "sdk";
 
   /**
-   * The name of the flag used to disable error notifications.
-   */
-  static const String NO_ERROR_NOTIFICATION = "no-error-notification";
-
-  /**
-   * The name of the flag used to disable the index.
-   */
-  static const String NO_INDEX = "no-index";
-
-  /**
-   * The name of the option used to set the file read mode.
-   */
-  static const String FILE_READ_MODE = "file-read-mode";
-
-  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -185,24 +313,6 @@
       return;
     }
 
-    // TODO(brianwilkerson) Enable this after it is possible for an
-    // instrumentation server to be provided.
-//    if (results[ENABLE_INSTRUMENTATION_OPTION]) {
-//      if (instrumentationServer == null) {
-//        print('Exiting server: enabled instrumentation without providing an instrumentation server');
-//        print('');
-//        _printUsage(parser);
-//        return;
-//      }
-//    } else {
-//      if (instrumentationServer != null) {
-//        print('Exiting server: providing an instrumentation server without enabling instrumentation');
-//        print('');
-//        _printUsage(parser);
-//        return;
-//      }
-//    }
-
     // TODO (danrubel) Remove this workaround
     // once the underlying VM and dart:io issue has been fixed.
     if (results[INTERNAL_DELAY_FREQUENCY] != null) {
@@ -244,7 +354,9 @@
       // which will make a guess.
       defaultSdk = DirectoryBasedDartSdk.defaultSdk;
     }
-
+    //
+    // Initialize the instrumentation service.
+    //
     if (instrumentationServer != null) {
       String filePath = results[INSTRUMENTATION_LOG_FILE];
       if (filePath != null) {
@@ -258,6 +370,12 @@
         results[CLIENT_VERSION], AnalysisServer.VERSION, defaultSdk.sdkVersion);
     AnalysisEngine.instance.instrumentationService = service;
     //
+    // Enable the new task model, if appropriate.
+    //
+    if (results[ENABLE_NEW_TASK_MODEL]) {
+      AnalysisEngine.instance.useTaskModel = true;
+    }
+    //
     // Process all of the plugins so that extensions are registered.
     //
     ServerPlugin serverPlugin = new ServerPlugin();
@@ -267,7 +385,9 @@
     plugins.addAll(_userDefinedPlugins);
     ExtensionManager manager = new ExtensionManager();
     manager.processPlugins(plugins);
-
+    //
+    // Create the sockets and start listening for requests.
+    //
     socketServer = new SocketServer(
         analysisServerOptions, defaultSdk, service, serverPlugin);
     httpServer = new HttpAnalysisServer(socketServer);
@@ -336,6 +456,11 @@
         help: "enable sending instrumentation information to a server",
         defaultsTo: false,
         negatable: false);
+    parser.addFlag(ENABLE_NEW_TASK_MODEL,
+        help: "enable the use of the new task model",
+        defaultsTo: false,
+        hide: true,
+        negatable: false);
     parser.addFlag(HELP_OPTION,
         help: "print this help message without starting a server",
         defaultsTo: false,
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart
index 0dac520..56a6d73 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart
@@ -19,7 +19,7 @@
     DartCompletionRequest request, List<String> namedArgs, String name) {
   if (name != null && name.length > 0 && !namedArgs.contains(name)) {
     request.addSuggestion(new CompletionSuggestion(
-        CompletionSuggestionKind.NAMED_ARGUMENT, DART_RELEVANCE_PARAMETER,
+        CompletionSuggestionKind.NAMED_ARGUMENT, DART_RELEVANCE_NAMED_PARAMETER,
         '$name: ', name.length + 2, 0, false, false));
   }
 }
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/completion_manager.dart b/dart/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
index 5ed7b1a..5708274 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
@@ -6,9 +6,13 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/completion/completion_core.dart'
+    show CompletionRequest;
+import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -130,10 +134,6 @@
     _stopwatch.start();
   }
 
-  void setContentsAndOffset(String contents, int offset) {
-    snippet = _computeSnippet(contents, offset);
-  }
-
   int get elapsedInMilliseconds =>
       operations.length > 0 ? operations.last.elapsed.inMilliseconds : 0;
 
@@ -181,6 +181,10 @@
     _startTimes[tag] = _stopwatch.elapsed;
   }
 
+  void setContentsAndOffset(String contents, int offset) {
+    snippet = _computeSnippet(contents, offset);
+  }
+
   void _logDuration(String tag, Duration elapsed) {
     operations.add(new OperationPerformance(tag, elapsed));
   }
@@ -217,18 +221,26 @@
 /**
  * Encapsulates information specific to a particular completion request.
  */
-class CompletionRequest {
+class CompletionRequestImpl implements CompletionRequest {
+
   /**
-   * The offset within the source at which the completion is requested.
+   * The underlying analysis server for this completion request.
    */
+  final AnalysisServer server;
+
+  @override
+  final AnalysisContext context;
+
+  @override
+  final Source source;
+
+  @override
   final int offset;
 
-  /**
-   * Performance measurements for this particular request.
-   */
-  final CompletionPerformance performance;
+  CompletionRequestImpl(this.server, this.context, this.source, this.offset);
 
-  CompletionRequest(this.offset, this.performance);
+  @override
+  ResourceProvider get resourceProvider => server.resourceProvider;
 }
 
 /**
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart b/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
index d8afca4..67a7245 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
@@ -177,17 +177,20 @@
   /**
    * Add constructor suggestions for the given class.
    */
-  void _addConstructorSuggestions(ClassElement classElem, int relevance) {
+  void _addConstructorSuggestions(
+      ClassElement classElem, int relevance, Source importForSource) {
     String className = classElem.name;
     for (ConstructorElement constructor in classElem.constructors) {
       if (!constructor.isPrivate) {
-        CompletionSuggestion suggestion =
-            createSuggestion(constructor, relevance: relevance);
-        String name = suggestion.completion;
-        name = name.length > 0 ? '$className.$name' : className;
-        suggestion.completion = name;
-        suggestion.selectionOffset = suggestion.completion.length;
-        importedConstructorSuggestions.add(suggestion);
+        CompletionSuggestion suggestion = createSuggestion(constructor,
+            relevance: relevance, importForSource: importForSource);
+        if (suggestion != null) {
+          String name = suggestion.completion;
+          name = name.length > 0 ? '$className.$name' : className;
+          suggestion.completion = name;
+          suggestion.selectionOffset = suggestion.completion.length;
+          importedConstructorSuggestions.add(suggestion);
+        }
       }
     }
   }
@@ -299,7 +302,7 @@
             element.isPublic &&
             !excludedLibs.contains(element.library) &&
             !_importedCompletions.contains(element.displayName)) {
-          _addSuggestion(element, DART_RELEVANCE_LOW);
+          _addSuggestion(element, DART_RELEVANCE_LOW, importForSource: source);
         }
       }
     });
@@ -308,7 +311,8 @@
   /**
    * Add a suggestion for the given element.
    */
-  void _addSuggestion(Element element, int relevance) {
+  void _addSuggestion(Element element, int relevance,
+      {Source importForSource}) {
     if (element is ExecutableElement) {
       // Do not suggest operators or local functions
       if (element.isOperator) {
@@ -321,25 +325,27 @@
       }
     }
 
-    CompletionSuggestion suggestion =
-        createSuggestion(element, relevance: relevance);
+    CompletionSuggestion suggestion = createSuggestion(element,
+        relevance: relevance, importForSource: importForSource);
 
-    if (element is ExecutableElement) {
-      DartType returnType = element.returnType;
-      if (returnType != null && returnType.isVoid) {
-        importedVoidReturnSuggestions.add(suggestion);
+    if (suggestion != null) {
+      if (element is ExecutableElement) {
+        DartType returnType = element.returnType;
+        if (returnType != null && returnType.isVoid) {
+          importedVoidReturnSuggestions.add(suggestion);
+        } else {
+          otherImportedSuggestions.add(suggestion);
+        }
+      } else if (element is FunctionTypeAliasElement) {
+        importedTypeSuggestions.add(suggestion);
+      } else if (element is ClassElement) {
+        importedTypeSuggestions.add(suggestion);
+        _addConstructorSuggestions(element, relevance, importForSource);
       } else {
         otherImportedSuggestions.add(suggestion);
       }
-    } else if (element is FunctionTypeAliasElement) {
-      importedTypeSuggestions.add(suggestion);
-    } else if (element is ClassElement) {
-      importedTypeSuggestions.add(suggestion);
-      _addConstructorSuggestions(element, relevance);
-    } else {
-      otherImportedSuggestions.add(suggestion);
+      _importedCompletions.add(suggestion.completion);
     }
-    _importedCompletions.add(suggestion.completion);
   }
 
   /**
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index c1b0339..88b78a4 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -6,6 +6,9 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/completion/completion_core.dart'
+    show CompletionRequest;
+import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/combinator_contributor.dart';
@@ -13,11 +16,12 @@
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/completion_target.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
+import 'package:analysis_server/src/services/completion/import_uri_contributor.dart';
 import 'package:analysis_server/src/services/completion/imported_reference_contributor.dart';
-import 'package:analysis_server/src/services/completion/prefixed_element_contributor.dart';
 import 'package:analysis_server/src/services/completion/keyword_contributor.dart';
 import 'package:analysis_server/src/services/completion/local_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/optype.dart';
+import 'package:analysis_server/src/services/completion/prefixed_element_contributor.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -39,6 +43,7 @@
 const int DART_RELEVANCE_LOCAL_VARIABLE = 1059;
 const int DART_RELEVANCE_LOW = 500;
 const int DART_RELEVANCE_PARAMETER = 1059;
+const int DART_RELEVANCE_NAMED_PARAMETER = 1060;
 
 /**
  * The base class for contributing code completion suggestions.
@@ -86,7 +91,8 @@
         new KeywordContributor(),
         new ArgListContributor(),
         new CombinatorContributor(),
-        new PrefixedElementContributor()
+        new PrefixedElementContributor(),
+        new ImportUriContributor(),
       ];
     }
     if (commonUsageComputer == null) {
@@ -119,8 +125,9 @@
    * then send an initial response to the client.
    * Return a list of contributors for which [computeFull] should be called
    */
-  List<DartCompletionContributor> computeFast(DartCompletionRequest request) {
-    return request.performance.logElapseTime('computeFast', () {
+  List<DartCompletionContributor> computeFast(
+      DartCompletionRequest request, CompletionPerformance performance) {
+    return performance.logElapseTime('computeFast', () {
       CompilationUnit unit = context.parseCompilationUnit(source);
       request.unit = unit;
       request.target = new CompletionTarget.forOffset(unit, request.offset);
@@ -143,8 +150,7 @@
 
       List<DartCompletionContributor> todo = new List.from(contributors);
       todo.removeWhere((DartCompletionContributor c) {
-        return request.performance.logElapseTime('computeFast ${c.runtimeType}',
-            () {
+        return performance.logElapseTime('computeFast ${c.runtimeType}', () {
           return c.computeFast(request);
         });
       });
@@ -159,19 +165,19 @@
    * resolved and request that each remaining contributor finish their work.
    * Return a [Future] that completes when the last notification has been sent.
    */
-  Future computeFull(
-      DartCompletionRequest request, List<DartCompletionContributor> todo) {
-    request.performance.logStartTime('waitForAnalysis');
+  Future computeFull(DartCompletionRequest request,
+      CompletionPerformance performance, List<DartCompletionContributor> todo) {
+    performance.logStartTime('waitForAnalysis');
     return waitForAnalysis().then((CompilationUnit unit) {
       if (controller.isClosed) {
         return;
       }
-      request.performance.logElapseTime('waitForAnalysis');
+      performance.logElapseTime('waitForAnalysis');
       if (unit == null) {
         sendResults(request, true);
         return;
       }
-      request.performance.logElapseTime('computeFull', () {
+      performance.logElapseTime('computeFull', () {
         request.unit = unit;
         // TODO(paulberry): Do we need to invoke _ReplacementOffsetBuilder
         // again?
@@ -180,10 +186,10 @@
         todo.forEach((DartCompletionContributor c) {
           String name = c.runtimeType.toString();
           String completeTag = 'computeFull $name complete';
-          request.performance.logStartTime(completeTag);
-          request.performance.logElapseTime('computeFull $name', () {
+          performance.logStartTime(completeTag);
+          performance.logElapseTime('computeFull $name', () {
             c.computeFull(request).then((bool changed) {
-              request.performance.logElapseTime(completeTag);
+              performance.logElapseTime(completeTag);
               bool last = --count == 0;
               if (changed || last) {
                 commonUsageComputer.computeFull(request);
@@ -198,13 +204,13 @@
 
   @override
   void computeSuggestions(CompletionRequest completionRequest) {
-    DartCompletionRequest request = new DartCompletionRequest(context,
-        searchEngine, source, completionRequest.offset, cache,
-        completionRequest.performance);
-    request.performance.logElapseTime('compute', () {
-      List<DartCompletionContributor> todo = computeFast(request);
+    DartCompletionRequest request =
+        new DartCompletionRequest.from(completionRequest, cache);
+    CompletionPerformance performance = new CompletionPerformance();
+    performance.logElapseTime('compute', () {
+      List<DartCompletionContributor> todo = computeFast(request, performance);
       if (!todo.isEmpty) {
-        computeFull(request, todo);
+        computeFull(request, performance, todo);
       }
     });
   }
@@ -249,22 +255,7 @@
 /**
  * The context in which the completion is requested.
  */
-class DartCompletionRequest extends CompletionRequest {
-  /**
-   * The analysis context in which the completion is requested.
-   */
-  final AnalysisContext context;
-
-  /**
-   * The search engine for use when building suggestions.
-   */
-  final SearchEngine searchEngine;
-
-  /**
-   * The source in which the completion is requested.
-   */
-  final Source source;
-
+class DartCompletionRequest extends CompletionRequestImpl {
   /**
    * Cached information from a prior code completion operation.
    */
@@ -314,9 +305,13 @@
    */
   final Set<String> _completions = new Set<String>();
 
-  DartCompletionRequest(this.context, this.searchEngine, this.source,
-      int offset, this.cache, CompletionPerformance performance)
-      : super(offset, performance);
+  DartCompletionRequest(AnalysisServer server, AnalysisContext context,
+      Source source, int offset, this.cache)
+      : super(server, context, source, offset);
+
+  factory DartCompletionRequest.from(CompletionRequestImpl request,
+      DartCompletionCache cache) => new DartCompletionRequest(
+      request.server, request.context, request.source, request.offset, cache);
 
   /**
    * Return the original text from the [replacementOffset] to the [offset]
@@ -339,6 +334,11 @@
   }
 
   /**
+   * The search engine for use when building suggestions.
+   */
+  SearchEngine get searchEngine => server.searchEngine;
+
+  /**
    * The list of suggestions to be sent to the client.
    */
   Iterable<CompletionSuggestion> get suggestions => _suggestions;
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/import_uri_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/import_uri_contributor.dart
new file mode 100644
index 0000000..8551852
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/src/services/completion/import_uri_contributor.dart
@@ -0,0 +1,166 @@
+// 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.completion.contributor.dart.importuri;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+
+import '../../protocol_server.dart'
+    show CompletionSuggestion, CompletionSuggestionKind;
+
+/**
+ * A contributor for calculating uri suggestions
+ * for import and part directives.
+ */
+class ImportUriContributor extends DartCompletionContributor {
+  _ImportUriSuggestionBuilder builder;
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    builder = new _ImportUriSuggestionBuilder(request);
+    return builder.computeFast(request.target.containingNode);
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) {
+    return new Future.value(false);
+  }
+}
+
+class _ImportUriSuggestionBuilder extends SimpleAstVisitor {
+  final DartCompletionRequest request;
+  HashSet<String> _importedUris;
+
+  _ImportUriSuggestionBuilder(this.request);
+
+  bool computeFast(AstNode node) {
+    node.accept(this);
+    return true;
+  }
+
+  @override
+  visitSimpleStringLiteral(SimpleStringLiteral node) {
+    AstNode parent = node.parent;
+    if (parent is ImportDirective && parent.uri == node) {
+      String partial = node.literal.lexeme.substring(
+          node.contentsOffset - node.offset, request.offset - node.offset);
+      _computeImportedUris();
+      request.replacementOffset = node.contentsOffset;
+      request.replacementLength = node.contentsEnd - node.contentsOffset;
+      _addDartSuggestions();
+      _addPackageSuggestions(partial);
+      _addFileSuggestions(partial);
+    } else if (parent is PartDirective && parent.uri == node) {
+      String partial = node.literal.lexeme.substring(
+          node.contentsOffset - node.offset, request.offset - node.offset);
+      _computeImportedUris();
+      request.replacementOffset = node.contentsOffset;
+      request.replacementLength = node.contentsEnd - node.contentsOffset;
+      _addFileSuggestions(partial);
+    }
+  }
+
+  void _addDartSuggestions() {
+    _addSuggestion('dart:');
+    SourceFactory factory = request.context.sourceFactory;
+    for (SdkLibrary lib in factory.dartSdk.sdkLibraries) {
+      if (!lib.isInternal && !lib.isImplementation) {
+        if (!lib.shortName.startsWith('dart:_')) {
+          _addSuggestion(lib.shortName);
+        }
+      }
+    }
+  }
+
+  void _addFileSuggestions(String partial) {
+    Source source = request.source;
+    String sourceFullName = source.fullName;
+    String sourceShortName = source.shortName;
+    String dirPath = (partial.endsWith('/') || partial.endsWith(separator))
+        ? partial
+        : dirname(partial);
+    String prefix = dirPath == '.' ? '' : dirPath;
+    if (isRelative(dirPath)) {
+      String sourceDir = dirname(sourceFullName);
+      if (isAbsolute(sourceDir)) {
+        dirPath = join(sourceDir, dirPath);
+      } else {
+        return;
+      }
+    }
+    Resource dir = request.resourceProvider.getResource(dirPath);
+    if (dir is Folder) {
+      for (Resource child in dir.getChildren()) {
+        String completion;
+        if (child is Folder) {
+          completion = '$prefix${child.shortName}$separator';
+        } else {
+          completion = '$prefix${child.shortName}';
+        }
+        if (completion != sourceShortName && completion != sourceFullName) {
+          _addSuggestion(completion);
+        }
+      }
+    }
+  }
+
+  void _addPackageFolderSuggestions(
+      String partial, String prefix, Folder folder) {
+    for (Resource child in folder.getChildren()) {
+      if (child is Folder) {
+        String childPrefix = '$prefix${child.shortName}/';
+        _addSuggestion(childPrefix);
+        if (partial.startsWith(childPrefix)) {
+          _addPackageFolderSuggestions(partial, childPrefix, child);
+        }
+      } else {
+        _addSuggestion('$prefix${child.shortName}');
+      }
+    }
+  }
+
+  void _addPackageSuggestions(String partial) {
+    SourceFactory factory = request.context.sourceFactory;
+    Map<String, List<Folder>> packageMap = factory.packageMap;
+    if (packageMap != null) {
+      _addSuggestion('package:');
+      packageMap.forEach((String pkgName, List<Folder> folders) {
+        String prefix = 'package:$pkgName/';
+        _addSuggestion(prefix);
+        for (Folder folder in folders) {
+          _addPackageFolderSuggestions(partial, prefix, folder);
+        }
+      });
+    }
+  }
+
+  void _addSuggestion(String completion) {
+    if (!_importedUris.contains(completion)) {
+      request.addSuggestion(new CompletionSuggestion(
+          CompletionSuggestionKind.IMPORT, DART_RELEVANCE_DEFAULT, completion,
+          completion.length, 0, false, false));
+    }
+  }
+
+  void _computeImportedUris() {
+    _importedUris = new HashSet<String>();
+    _importedUris.add('dart:core');
+    for (Directive directive in request.unit.directives) {
+      if (directive is ImportDirective) {
+        String uri = directive.uriContent;
+        if (uri != null && uri.length > 0) {
+          _importedUris.add(uri);
+        }
+      }
+    }
+  }
+}
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
index 5608f8f..0fced1d 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/imported_reference_contributor.dart
@@ -191,9 +191,8 @@
       // Build a list of inherited types that are imported
       // and include any inherited imported members
       List<String> inheritedTypes = new List<String>();
-      visitInheritedTypes(classDecl, (_) {
-        // local declarations are handled by the local reference contributor
-      }, (String typeName) {
+      // local declarations are handled by the local reference contributor
+      visitInheritedTypes(classDecl, importedTypeName: (String typeName) {
         inheritedTypes.add(typeName);
       });
       HashSet<String> visited = new HashSet<String>();
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
index b979b8b..5414bcc 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/keyword_contributor.dart
@@ -11,6 +11,9 @@
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 
+const ASYNC = 'async';
+const AWAIT = 'await';
+
 /**
  * A contributor for calculating `completion.getSuggestions` request results
  * for the local library in which the completion is requested.
@@ -40,28 +43,16 @@
         this.entity = request.target.entity;
 
   @override
-  visitBlock(Block node) {
-    if (_isInClassMemberBody(node)) {
-      _addSuggestions([Keyword.SUPER, Keyword.THIS,]);
+  visitArgumentList(ArgumentList node) {
+    if (entity == node.rightParenthesis ||
+        (entity is SimpleIdentifier && node.arguments.contains(entity))) {
+      _addExpressionKeywords(node);
     }
-    _addSuggestions([
-      Keyword.ASSERT,
-      Keyword.CASE,
-      Keyword.CONTINUE,
-      Keyword.DO,
-      Keyword.FINAL,
-      Keyword.FOR,
-      Keyword.IF,
-      Keyword.NEW,
-      Keyword.RETHROW,
-      Keyword.RETURN,
-      Keyword.SWITCH,
-      Keyword.THROW,
-      Keyword.TRY,
-      Keyword.VAR,
-      Keyword.VOID,
-      Keyword.WHILE
-    ]);
+  }
+
+  @override
+  visitBlock(Block node) {
+    _addStatementKeywords(node);
   }
 
   @override
@@ -70,22 +61,18 @@
     if (entity == node.name) {
       return;
     }
-    if (entity == node.rightBracket || entity is ClassMember) {
-      _addSuggestions([
-        Keyword.CONST,
-        Keyword.DYNAMIC,
-        Keyword.FACTORY,
-        Keyword.FINAL,
-        Keyword.GET,
-        Keyword.OPERATOR,
-        Keyword.SET,
-        Keyword.STATIC,
-        Keyword.VAR,
-        Keyword.VOID
-      ]);
-      return;
+    if (entity == node.rightBracket) {
+      _addClassBodyKeywords();
+    } else if (entity is ClassMember) {
+      _addClassBodyKeywords();
+      int index = node.members.indexOf(entity);
+      ClassMember previous = index > 0 ? node.members[index - 1] : null;
+      if (previous is MethodDeclaration && previous.body is EmptyFunctionBody) {
+        _addSuggestion2(ASYNC);
+      }
+    } else {
+      _addClassDeclarationKeywords(node);
     }
-    _addClassDeclarationKeywords(node);
   }
 
   @override
@@ -120,20 +107,58 @@
           !node.directives.any((d) => d is LibraryDirective)) {
         _addSuggestions([Keyword.LIBRARY], DART_RELEVANCE_HIGH);
       }
-      _addSuggestions(
-          [Keyword.EXPORT, Keyword.IMPORT, Keyword.PART], DART_RELEVANCE_HIGH);
+      _addSuggestions([Keyword.EXPORT, Keyword.PART], DART_RELEVANCE_HIGH);
+      _addSuggestion2("import '';",
+          offset: 8, relevance: DART_RELEVANCE_HIGH + 1);
+      _addSuggestion2("import '' as ;",
+          offset: 8, relevance: DART_RELEVANCE_HIGH);
+      _addSuggestion2("import '' hide ;",
+          offset: 8, relevance: DART_RELEVANCE_HIGH);
+      _addSuggestion2("import '' show ;",
+          offset: 8, relevance: DART_RELEVANCE_HIGH);
     }
     if (entity == null || entity is Declaration) {
-      _addSuggestions([
-        Keyword.ABSTRACT,
-        Keyword.CLASS,
-        Keyword.CONST,
-        Keyword.DYNAMIC,
-        Keyword.FINAL,
-        Keyword.TYPEDEF,
-        Keyword.VAR,
-        Keyword.VOID
-      ], DART_RELEVANCE_HIGH);
+      if (previousMember is FunctionDeclaration &&
+          previousMember.functionExpression is FunctionExpression &&
+          previousMember.functionExpression.body is EmptyFunctionBody) {
+        _addSuggestion2(ASYNC, relevance: DART_RELEVANCE_HIGH);
+      }
+      _addCompilationUnitKeywords();
+    }
+  }
+
+  @override
+  visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (entity == node.expression) {
+      _addExpressionKeywords(node);
+    }
+  }
+
+  @override
+  visitFormalParameterList(FormalParameterList node) {
+    AstNode constructorDecl =
+        node.getAncestor((p) => p is ConstructorDeclaration);
+    if (constructorDecl != null) {
+      _addSuggestions([Keyword.THIS]);
+    }
+  }
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    if (entity == node.body) {
+      _addSuggestion2(ASYNC, relevance: DART_RELEVANCE_HIGH);
+      if (node.body is EmptyFunctionBody &&
+          node.parent is FunctionDeclaration &&
+          node.parent.parent is CompilationUnit) {
+        _addCompilationUnitKeywords();
+      }
+    }
+  }
+
+  @override
+  visitIfStatement(IfStatement node) {
+    if (entity == node.thenStatement) {
+      _addStatementKeywords(node);
     }
   }
 
@@ -149,15 +174,74 @@
     }
   }
 
-  void _addImportDirectiveKeywords(ImportDirective node) {
-    if (node.asKeyword == null) {
-      _addSuggestion(Keyword.AS, DART_RELEVANCE_HIGH);
-      if (node.deferredKeyword == null) {
-        _addSuggestion(Keyword.DEFERRED, DART_RELEVANCE_HIGH);
+  @override
+  visitMethodDeclaration(MethodDeclaration node) {
+    if (entity == node.body) {
+      if (node.body is EmptyFunctionBody) {
+        _addClassBodyKeywords();
+        _addSuggestion2(ASYNC);
+      } else {
+        _addSuggestion2(ASYNC, relevance: DART_RELEVANCE_HIGH);
       }
     }
   }
 
+  @override
+  visitNamedExpression(NamedExpression node) {
+    if (entity is SimpleIdentifier && entity == node.expression) {
+      _addExpressionKeywords(node);
+    }
+  }
+
+  @override
+  visitNode(AstNode node) {
+    // ignored
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    if (entity == node.expression) {
+      _addExpressionKeywords(node);
+    } else if (entity == node.rightBracket) {
+      if (node.members.isEmpty) {
+        _addSuggestions([Keyword.CASE, Keyword.DEFAULT], DART_RELEVANCE_HIGH);
+      } else {
+        _addSuggestions([Keyword.CASE, Keyword.DEFAULT]);
+        _addStatementKeywords(node);
+      }
+    }
+    if (node.members.contains(entity)) {
+      if (entity == node.members.first) {
+        _addSuggestions([Keyword.CASE, Keyword.DEFAULT], DART_RELEVANCE_HIGH);
+      } else {
+        _addSuggestions([Keyword.CASE, Keyword.DEFAULT]);
+        _addStatementKeywords(node);
+      }
+    }
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    if (entity == node.initializer) {
+      _addExpressionKeywords(node);
+    }
+  }
+
+  void _addClassBodyKeywords() {
+    _addSuggestions([
+      Keyword.CONST,
+      Keyword.DYNAMIC,
+      Keyword.FACTORY,
+      Keyword.FINAL,
+      Keyword.GET,
+      Keyword.OPERATOR,
+      Keyword.SET,
+      Keyword.STATIC,
+      Keyword.VAR,
+      Keyword.VOID
+    ]);
+  }
+
   void _addClassDeclarationKeywords(ClassDeclaration node) {
     // Very simplistic suggestion because analyzer will warn if
     // the extends / with / implements keywords are out of order
@@ -171,12 +255,77 @@
     }
   }
 
+  void _addCompilationUnitKeywords() {
+    _addSuggestions([
+      Keyword.ABSTRACT,
+      Keyword.CLASS,
+      Keyword.CONST,
+      Keyword.DYNAMIC,
+      Keyword.FINAL,
+      Keyword.TYPEDEF,
+      Keyword.VAR,
+      Keyword.VOID
+    ], DART_RELEVANCE_HIGH);
+  }
+
+  void _addExpressionKeywords(AstNode node) {
+    _addSuggestions([Keyword.FALSE, Keyword.NEW, Keyword.NULL, Keyword.TRUE,]);
+    if (_inClassMemberBody(node)) {
+      _addSuggestions([Keyword.SUPER, Keyword.THIS,]);
+    }
+    if (_inAsyncMethodOrFunction(node)) {
+      _addSuggestion2(AWAIT);
+    }
+  }
+
+  void _addImportDirectiveKeywords(ImportDirective node) {
+    if (node.asKeyword == null) {
+      _addSuggestion(Keyword.AS, DART_RELEVANCE_HIGH);
+      if (node.deferredKeyword == null) {
+        _addSuggestion(Keyword.DEFERRED, DART_RELEVANCE_HIGH);
+      }
+    }
+  }
+
+  void _addStatementKeywords(AstNode node) {
+    if (_inClassMemberBody(node)) {
+      _addSuggestions([Keyword.SUPER, Keyword.THIS,]);
+    }
+    if (_inAsyncMethodOrFunction(node)) {
+      _addSuggestion2(AWAIT);
+    }
+    _addSuggestions([
+      Keyword.ASSERT,
+      Keyword.CONTINUE,
+      Keyword.DO,
+      Keyword.FINAL,
+      Keyword.FOR,
+      Keyword.IF,
+      Keyword.NEW,
+      Keyword.RETHROW,
+      Keyword.RETURN,
+      Keyword.SWITCH,
+      Keyword.THROW,
+      Keyword.TRY,
+      Keyword.VAR,
+      Keyword.VOID,
+      Keyword.WHILE
+    ]);
+  }
+
   void _addSuggestion(Keyword keyword,
-      [int relevance = DART_RELEVANCE_DEFAULT]) {
-    String completion = keyword.syntax;
+      [int relevance = DART_RELEVANCE_KEYWORD]) {
+    _addSuggestion2(keyword.syntax, relevance: relevance);
+  }
+
+  void _addSuggestion2(String completion,
+      {int offset, int relevance: DART_RELEVANCE_KEYWORD}) {
+    if (offset == null) {
+      offset = completion.length;
+    }
     request.addSuggestion(new CompletionSuggestion(
-        CompletionSuggestionKind.KEYWORD, relevance, completion,
-        completion.length, 0, false, false));
+        CompletionSuggestionKind.KEYWORD, relevance, completion, offset, 0,
+        false, false));
   }
 
   void _addSuggestions(List<Keyword> keywords,
@@ -186,7 +335,12 @@
     });
   }
 
-  bool _isInClassMemberBody(AstNode node) {
+  bool _inAsyncMethodOrFunction(AstNode node) {
+    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    return body != null && body.isAsynchronous;
+  }
+
+  bool _inClassMemberBody(AstNode node) {
     while (true) {
       AstNode body = node.getAncestor((n) => n is FunctionBody);
       if (body == null) {
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart b/dart/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
index d00921a..6ba0afa 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/local_declaration_visitor.dart
@@ -110,10 +110,9 @@
   @override
   void visitClassDeclaration(ClassDeclaration node) {
     _visitClassDeclarationMembers(node);
-    visitInheritedTypes(node, (ClassDeclaration classNode) {
+    // imported types are handled by the imported reference contributor
+    visitInheritedTypes(node, localDeclaration: (ClassDeclaration classNode) {
       _visitClassDeclarationMembers(classNode);
-    }, (String typeName) {
-      // ignored
     });
     visitNode(node);
   }
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
index 12cdd5e..7701bb8 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/local_reference_contributor.dart
@@ -11,71 +11,11 @@
 import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/local_declaration_visitor.dart';
+import 'package:analysis_server/src/services/completion/local_suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/optype.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
-const _DYNAMIC = 'dynamic';
-
-final TypeName _NO_RETURN_TYPE = new TypeName(
-    new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, '', 0)), null);
-
-/**
- * Create a new protocol Element for inclusion in a completion suggestion.
- */
-protocol.Element _createElement(protocol.ElementKind kind, SimpleIdentifier id,
-    {String parameters, TypeName returnType, bool isAbstract: false,
-    bool isDeprecated: false}) {
-  String name = id != null ? id.name : '';
-  int flags = protocol.Element.makeFlags(
-      isAbstract: isAbstract,
-      isDeprecated: isDeprecated,
-      isPrivate: Identifier.isPrivateName(name));
-  return new protocol.Element(kind, name, flags,
-      parameters: parameters, returnType: _nameForType(returnType));
-}
-
-/**
- * Return `true` if the @deprecated annotation is present
- */
-bool _isDeprecated(AnnotatedNode node) {
-  if (node != null) {
-    NodeList<Annotation> metadata = node.metadata;
-    if (metadata != null) {
-      return metadata.any((Annotation a) {
-        return a.name is SimpleIdentifier && a.name.name == 'deprecated';
-      });
-    }
-  }
-  return false;
-}
-
-/**
- * Return the name for the given type.
- */
-String _nameForType(TypeName type) {
-  if (type == _NO_RETURN_TYPE) {
-    return null;
-  }
-  if (type == null) {
-    return _DYNAMIC;
-  }
-  Identifier id = type.name;
-  if (id == null) {
-    return _DYNAMIC;
-  }
-  String name = id.name;
-  if (name == null || name.length <= 0) {
-    return _DYNAMIC;
-  }
-  TypeArgumentList typeArgs = type.typeArguments;
-  if (typeArgs != null) {
-    //TODO (danrubel) include type arguments
-  }
-  return name;
-}
-
 /**
  * A contributor for calculating `completion.getSuggestions` request results
  * for the local library in which the completion is requested.
@@ -217,8 +157,7 @@
         }
       }
     }
-    bool isDeprecated =
-        constructorDecl != null && _isDeprecated(constructorDecl);
+    bool deprecated = constructorDecl != null && isDeprecated(constructorDecl);
     List<String> parameterNames = new List<String>();
     List<String> parameterTypes = new List<String>();
     int requiredParameterCount = 0;
@@ -260,14 +199,14 @@
       paramBuf.write(hasNamedParameters ? '}' : ']');
     }
     paramBuf.write(')');
-    protocol.Element element = _createElement(
+    protocol.Element element = createElement(
         protocol.ElementKind.CONSTRUCTOR, elemId,
         parameters: paramBuf.toString());
     element.returnType = classDecl.name.name;
     CompletionSuggestion suggestion = new CompletionSuggestion(
         CompletionSuggestionKind.INVOCATION,
-        isDeprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT, completion,
-        completion.length, 0, isDeprecated, false,
+        deprecated ? DART_RELEVANCE_LOW : DART_RELEVANCE_DEFAULT, completion,
+        completion.length, 0, deprecated, false,
         declaringType: classDecl.name.name,
         element: element,
         parameterNames: parameterNames,
@@ -283,7 +222,7 @@
    */
   String _nameForParamType(NormalFormalParameter param) {
     if (param is SimpleFormalParameter) {
-      return _nameForType(param.type);
+      return nameForType(param.type);
     }
     SimpleIdentifier id = param.identifier;
     if (param is FieldFormalParameter && id != null) {
@@ -294,14 +233,14 @@
           if (member is FieldDeclaration) {
             for (VariableDeclaration field in member.fields.variables) {
               if (field.name.name == fieldName) {
-                return _nameForType(member.fields.type);
+                return nameForType(member.fields.type);
               }
             }
           }
         }
       }
     }
-    return _DYNAMIC;
+    return DYNAMIC;
   }
 }
 
@@ -436,15 +375,15 @@
   @override
   void declaredClass(ClassDeclaration declaration) {
     if (optype.includeTypeNameSuggestions) {
-      bool isDeprecated = _isDeprecated(declaration);
-      CompletionSuggestion suggestion = _addSuggestion(declaration.name,
-          _NO_RETURN_TYPE, isDeprecated, DART_RELEVANCE_DEFAULT);
+      bool deprecated = isDeprecated(declaration);
+      CompletionSuggestion suggestion = _addSuggestion(
+          declaration.name, NO_RETURN_TYPE, deprecated, DART_RELEVANCE_DEFAULT);
       if (suggestion != null) {
-        suggestion.element = _createElement(
+        suggestion.element = createElement(
             protocol.ElementKind.CLASS, declaration.name,
-            returnType: _NO_RETURN_TYPE,
+            returnType: NO_RETURN_TYPE,
             isAbstract: declaration.isAbstract,
-            isDeprecated: isDeprecated);
+            isDeprecated: deprecated);
       }
     }
   }
@@ -452,15 +391,15 @@
   @override
   void declaredClassTypeAlias(ClassTypeAlias declaration) {
     if (optype.includeTypeNameSuggestions) {
-      bool isDeprecated = _isDeprecated(declaration);
-      CompletionSuggestion suggestion = _addSuggestion(declaration.name,
-          _NO_RETURN_TYPE, isDeprecated, DART_RELEVANCE_DEFAULT);
+      bool deprecated = isDeprecated(declaration);
+      CompletionSuggestion suggestion = _addSuggestion(
+          declaration.name, NO_RETURN_TYPE, deprecated, DART_RELEVANCE_DEFAULT);
       if (suggestion != null) {
-        suggestion.element = _createElement(
+        suggestion.element = createElement(
             protocol.ElementKind.CLASS_TYPE_ALIAS, declaration.name,
-            returnType: _NO_RETURN_TYPE,
+            returnType: NO_RETURN_TYPE,
             isAbstract: true,
-            isDeprecated: isDeprecated);
+            isDeprecated: deprecated);
       }
     }
   }
@@ -468,15 +407,10 @@
   @override
   void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
     if (optype.includeReturnValueSuggestions) {
-      bool isDeprecated = _isDeprecated(fieldDecl) || _isDeprecated(varDecl);
-      TypeName type = fieldDecl.fields.type;
-      CompletionSuggestion suggestion = _addSuggestion(
-          varDecl.name, type, isDeprecated, DART_RELEVANCE_LOCAL_FIELD,
-          classDecl: fieldDecl.parent);
+      CompletionSuggestion suggestion =
+          createFieldSuggestion(fieldDecl, varDecl);
       if (suggestion != null) {
-        suggestion.element = _createElement(
-            protocol.ElementKind.FIELD, varDecl.name,
-            returnType: type, isDeprecated: isDeprecated);
+        request.addSuggestion(suggestion);
       }
     }
   }
@@ -486,7 +420,7 @@
     if (optype.includeReturnValueSuggestions ||
         optype.includeVoidReturnSuggestions) {
       TypeName returnType = declaration.returnType;
-      bool isDeprecated = _isDeprecated(declaration);
+      bool deprecated = isDeprecated(declaration);
       protocol.ElementKind kind;
       int defaultRelevance = DART_RELEVANCE_DEFAULT;
       if (declaration.isGetter) {
@@ -497,7 +431,7 @@
           return;
         }
         kind = protocol.ElementKind.SETTER;
-        returnType = _NO_RETURN_TYPE;
+        returnType = NO_RETURN_TYPE;
         defaultRelevance = DART_RELEVANCE_LOCAL_ACCESSOR;
       } else {
         if (!optype.includeVoidReturnSuggestions && _isVoid(returnType)) {
@@ -507,13 +441,13 @@
         defaultRelevance = DART_RELEVANCE_LOCAL_FUNCTION;
       }
       CompletionSuggestion suggestion = _addSuggestion(
-          declaration.name, returnType, isDeprecated, defaultRelevance);
+          declaration.name, returnType, deprecated, defaultRelevance);
       if (suggestion != null) {
         FormalParameterList param = declaration.functionExpression.parameters;
-        suggestion.element = _createElement(kind, declaration.name,
+        suggestion.element = createElement(kind, declaration.name,
             parameters: param != null ? param.toSource() : null,
             returnType: returnType,
-            isDeprecated: isDeprecated);
+            isDeprecated: deprecated);
         if (kind == protocol.ElementKind.FUNCTION) {
           _addParameterInfo(
               suggestion, declaration.functionExpression.parameters);
@@ -525,17 +459,15 @@
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
     if (optype.includeTypeNameSuggestions) {
-      bool isDeprecated = _isDeprecated(declaration);
+      bool deprecated = isDeprecated(declaration);
       TypeName returnType = declaration.returnType;
       CompletionSuggestion suggestion = _addSuggestion(
-          declaration.name, returnType, isDeprecated, DART_RELEVANCE_DEFAULT);
+          declaration.name, returnType, deprecated, DART_RELEVANCE_DEFAULT);
       if (suggestion != null) {
         // TODO (danrubel) determine parameters and return type
-        suggestion.element = _createElement(
+        suggestion.element = createElement(
             protocol.ElementKind.FUNCTION_TYPE_ALIAS, declaration.name,
-            returnType: returnType,
-            isAbstract: true,
-            isDeprecated: isDeprecated);
+            returnType: returnType, isAbstract: true, isDeprecated: deprecated);
       }
     }
   }
@@ -551,7 +483,7 @@
       CompletionSuggestion suggestion =
           _addSuggestion(name, type, false, DART_RELEVANCE_LOCAL_VARIABLE);
       if (suggestion != null) {
-        suggestion.element = _createElement(
+        suggestion.element = createElement(
             protocol.ElementKind.LOCAL_VARIABLE, name, returnType: type);
       }
     }
@@ -574,7 +506,7 @@
           return;
         }
         kind = protocol.ElementKind.SETTER;
-        returnType = _NO_RETURN_TYPE;
+        returnType = NO_RETURN_TYPE;
         defaultRelevance = DART_RELEVANCE_LOCAL_ACCESSOR;
       } else {
         if (!optype.includeVoidReturnSuggestions && _isVoid(returnType)) {
@@ -584,16 +516,16 @@
         parameters = declaration.parameters.toSource();
         defaultRelevance = DART_RELEVANCE_LOCAL_METHOD;
       }
-      bool isDeprecated = _isDeprecated(declaration);
+      bool deprecated = isDeprecated(declaration);
       CompletionSuggestion suggestion = _addSuggestion(
-          declaration.name, returnType, isDeprecated, defaultRelevance,
+          declaration.name, returnType, deprecated, defaultRelevance,
           classDecl: declaration.parent);
       if (suggestion != null) {
-        suggestion.element = _createElement(kind, declaration.name,
+        suggestion.element = createElement(kind, declaration.name,
             parameters: parameters,
             returnType: returnType,
             isAbstract: declaration.isAbstract,
-            isDeprecated: isDeprecated);
+            isDeprecated: deprecated);
         if (kind == protocol.ElementKind.METHOD) {
           _addParameterInfo(suggestion, declaration.parameters);
         }
@@ -607,8 +539,8 @@
       CompletionSuggestion suggestion =
           _addSuggestion(name, type, false, DART_RELEVANCE_PARAMETER);
       if (suggestion != null) {
-        suggestion.element = _createElement(
-            protocol.ElementKind.PARAMETER, name, returnType: type);
+        suggestion.element = createElement(protocol.ElementKind.PARAMETER, name,
+            returnType: type);
       }
     }
   }
@@ -617,13 +549,13 @@
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {
     if (optype.includeReturnValueSuggestions) {
-      bool isDeprecated = _isDeprecated(varList) || _isDeprecated(varDecl);
+      bool deprecated = isDeprecated(varList) || isDeprecated(varDecl);
       CompletionSuggestion suggestion = _addSuggestion(varDecl.name,
-          varList.type, isDeprecated, DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
+          varList.type, deprecated, DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
       if (suggestion != null) {
-        suggestion.element = _createElement(
+        suggestion.element = createElement(
             protocol.ElementKind.TOP_LEVEL_VARIABLE, varDecl.name,
-            returnType: varList.type, isDeprecated: isDeprecated);
+            returnType: varList.type, isDeprecated: deprecated);
       }
     }
   }
@@ -666,28 +598,12 @@
 
   CompletionSuggestion _addSuggestion(SimpleIdentifier id, TypeName returnType,
       bool isDeprecated, int defaultRelevance, {ClassDeclaration classDecl}) {
-    if (id != null) {
-      String completion = id.name;
-      if (completion != null && completion.length > 0 && completion != '_') {
-        CompletionSuggestion suggestion = new CompletionSuggestion(
-            CompletionSuggestionKind.INVOCATION,
-            isDeprecated ? DART_RELEVANCE_LOW : defaultRelevance, completion,
-            completion.length, 0, isDeprecated, false,
-            returnType: _nameForType(returnType));
-        if (classDecl != null) {
-          SimpleIdentifier identifier = classDecl.name;
-          if (identifier != null) {
-            String name = identifier.name;
-            if (name != null && name.length > 0) {
-              suggestion.declaringType = name;
-            }
-          }
-        }
-        request.addSuggestion(suggestion);
-        return suggestion;
-      }
+    CompletionSuggestion suggestion = createSuggestion(
+        id, isDeprecated, defaultRelevance, returnType, classDecl: classDecl);
+    if (suggestion != null) {
+      request.addSuggestion(suggestion);
     }
-    return null;
+    return suggestion;
   }
 
   bool _isVoid(TypeName returnType) {
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/local_suggestion_builder.dart b/dart/pkg/analysis_server/lib/src/services/completion/local_suggestion_builder.dart
new file mode 100644
index 0000000..8014dd4
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/src/services/completion/local_suggestion_builder.dart
@@ -0,0 +1,118 @@
+// 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.completion.suggestion.builder.local;
+
+import 'package:analysis_server/src/protocol.dart' as protocol
+    show Element, ElementKind;
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+
+const DYNAMIC = 'dynamic';
+
+final TypeName NO_RETURN_TYPE = new TypeName(
+    new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, '', 0)), null);
+
+/**
+ * Create a new protocol Element for inclusion in a completion suggestion.
+ */
+protocol.Element createElement(protocol.ElementKind kind, SimpleIdentifier id,
+    {String parameters, TypeName returnType, bool isAbstract: false,
+    bool isDeprecated: false}) {
+  String name = id != null ? id.name : '';
+  int flags = protocol.Element.makeFlags(
+      isAbstract: isAbstract,
+      isDeprecated: isDeprecated,
+      isPrivate: Identifier.isPrivateName(name));
+  return new protocol.Element(kind, name, flags,
+      parameters: parameters, returnType: nameForType(returnType));
+}
+
+/**
+ * Create a new suggestion for the given field.
+ * Return the new suggestion or `null` if it could not be created.
+ */
+CompletionSuggestion createFieldSuggestion(
+    FieldDeclaration fieldDecl, VariableDeclaration varDecl) {
+  bool deprecated = isDeprecated(fieldDecl) || isDeprecated(varDecl);
+  TypeName type = fieldDecl.fields.type;
+  return createSuggestion(
+      varDecl.name, deprecated, DART_RELEVANCE_LOCAL_FIELD, type,
+      classDecl: fieldDecl.parent,
+      element: createElement(protocol.ElementKind.FIELD, varDecl.name,
+          returnType: type, isDeprecated: deprecated));
+}
+
+/**
+ * Create a new suggestion based upon the given information.
+ * Return the new suggestion or `null` if it could not be created.
+ */
+CompletionSuggestion createSuggestion(SimpleIdentifier id, bool isDeprecated,
+    int defaultRelevance, TypeName returnType,
+    {ClassDeclaration classDecl, protocol.Element element}) {
+  if (id == null) {
+    return null;
+  }
+  String completion = id.name;
+  if (completion == null || completion.length <= 0 || completion == '_') {
+    return null;
+  }
+  CompletionSuggestion suggestion = new CompletionSuggestion(
+      CompletionSuggestionKind.INVOCATION,
+      isDeprecated ? DART_RELEVANCE_LOW : defaultRelevance, completion,
+      completion.length, 0, isDeprecated, false,
+      returnType: nameForType(returnType), element: element);
+  if (classDecl != null) {
+    SimpleIdentifier classId = classDecl.name;
+    if (classId != null) {
+      String className = classId.name;
+      if (className != null && className.length > 0) {
+        suggestion.declaringType = className;
+      }
+    }
+  }
+  return suggestion;
+}
+
+/**
+ * Return `true` if the @deprecated annotation is present
+ */
+bool isDeprecated(AnnotatedNode node) {
+  if (node != null) {
+    NodeList<Annotation> metadata = node.metadata;
+    if (metadata != null) {
+      return metadata.any((Annotation a) {
+        return a.name is SimpleIdentifier && a.name.name == 'deprecated';
+      });
+    }
+  }
+  return false;
+}
+
+/**
+ * Return the name for the given type.
+ */
+String nameForType(TypeName type) {
+  if (type == NO_RETURN_TYPE) {
+    return null;
+  }
+  if (type == null) {
+    return DYNAMIC;
+  }
+  Identifier id = type.name;
+  if (id == null) {
+    return DYNAMIC;
+  }
+  String name = id.name;
+  if (name == null || name.length <= 0) {
+    return DYNAMIC;
+  }
+  TypeArgumentList typeArgs = type.typeArguments;
+  if (typeArgs != null) {
+    //TODO (danrubel) include type arguments
+  }
+  return name;
+}
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/optype.dart b/dart/pkg/analysis_server/lib/src/services/completion/optype.dart
index 84bced9..c9d88bc 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/optype.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/optype.dart
@@ -442,6 +442,16 @@
   }
 
   @override
+  void visitFieldFormalParameter(FieldFormalParameter node) {
+    if (entity == node.identifier) {
+      optype.isPrefixed = true;
+    } else {
+      optype.includeReturnValueSuggestions = true;
+      optype.includeTypeNameSuggestions = true;
+    }
+  }
+
+  @override
   void visitNormalFormalParameter(NormalFormalParameter node) {
     optype.includeReturnValueSuggestions = true;
     optype.includeTypeNameSuggestions = true;
@@ -595,7 +605,7 @@
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     if ((node.keyword == null || node.keyword.lexeme != 'var') &&
-        (node.type == null)) {
+        (node.type == null || identical(entity, node.type))) {
       optype.includeTypeNameSuggestions = true;
     }
   }
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/prefixed_element_contributor.dart b/dart/pkg/analysis_server/lib/src/services/completion/prefixed_element_contributor.dart
index cb6ccf4..296ca24 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/prefixed_element_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/prefixed_element_contributor.dart
@@ -8,14 +8,15 @@
 
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/local_declaration_visitor.dart';
+import 'package:analysis_server/src/services/completion/local_suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/optype.dart';
 import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
-import '../../protocol_server.dart' as protocol;
 import '../../protocol_server.dart'
     show CompletionSuggestion, CompletionSuggestionKind;
+import '../../protocol_server.dart' as protocol;
 
 /**
  * A contributor for calculating invocation / access suggestions
@@ -80,6 +81,74 @@
 }
 
 /**
+ * A suggestion builder for 'this.' constructor arguments.
+ */
+class _FieldFormalSuggestionBuilder implements SuggestionBuilder {
+  final DartCompletionRequest request;
+
+  _FieldFormalSuggestionBuilder(this.request);
+
+  @override
+  bool computeFast(AstNode node) {
+    if (node is FieldFormalParameter) {
+      ConstructorDeclaration constructorDecl =
+          node.getAncestor((p) => p is ConstructorDeclaration);
+      if (constructorDecl != null) {
+
+        // Compute fields already referenced
+        List<String> referencedFields = new List<String>();
+        for (FormalParameter param in constructorDecl.parameters.parameters) {
+          if (param is FieldFormalParameter) {
+            SimpleIdentifier fieldId = param.identifier;
+            if (fieldId != null && fieldId != request.target.entity) {
+              String fieldName = fieldId.name;
+              if (fieldName != null && fieldName.length > 0) {
+                referencedFields.add(fieldName);
+              }
+            }
+          }
+        }
+
+        // Add suggestions for fields that are not already referenced
+        ClassDeclaration classDecl =
+            constructorDecl.getAncestor((p) => p is ClassDeclaration);
+        for (ClassMember member in classDecl.members) {
+          if (member is FieldDeclaration) {
+            for (VariableDeclaration varDecl in member.fields.variables) {
+              SimpleIdentifier fieldId = varDecl.name;
+              if (fieldId != null) {
+                String fieldName = fieldId.name;
+                if (fieldName != null && fieldName.length > 0) {
+                  if (!referencedFields.contains(fieldName)) {
+                    CompletionSuggestion suggestion =
+                        createFieldSuggestion(member, varDecl);
+                    if (suggestion != null) {
+                      request.addSuggestion(suggestion);
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    } else {
+      // This should never be called with a case not handled above.
+      assert(false);
+    }
+    return true;
+  }
+
+  @override
+  Future<bool> computeFull(AstNode node) {
+    // This should never be called; we should always be able to compute
+    // suggestions and return true in computeFast method.
+    assert(false);
+    return null;
+  }
+}
+
+/**
  * An [AstNode] vistor for determining which suggestion builder
  * should be used to build invocation/access suggestions.
  */
@@ -96,6 +165,11 @@
   }
 
   @override
+  SuggestionBuilder visitFieldFormalParameter(FieldFormalParameter node) {
+    return new _FieldFormalSuggestionBuilder(request);
+  }
+
+  @override
   SuggestionBuilder visitMethodInvocation(MethodInvocation node) {
     return new _ExpressionSuggestionBuilder(request);
   }
diff --git a/dart/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/dart/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index ac87e30..80ddd85 100644
--- a/dart/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/dart/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -14,16 +14,20 @@
 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/source.dart';
+import 'package:path/path.dart' as path;
 
 const String DYNAMIC = 'dynamic';
 
 /**
  * Return a suggestion based upon the given element
  * or `null` if a suggestion is not appropriate for the given element.
+ * If the suggestion is not currently in scope, then specify
+ * importForSource as the source to which an import should be added.
  */
 CompletionSuggestion createSuggestion(Element element,
     {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-    int relevance: DART_RELEVANCE_DEFAULT}) {
+    int relevance: DART_RELEVANCE_DEFAULT, Source importForSource}) {
   String nameForType(DartType type) {
     if (type == null) {
       return DYNAMIC;
@@ -78,6 +82,34 @@
         (ParameterElement parameter) =>
             parameter.parameterKind == ParameterKind.NAMED);
   }
+  if (importForSource != null) {
+    String srcPath = path.dirname(importForSource.fullName);
+    LibraryElement libElem = element.library;
+    if (libElem != null) {
+      Source libSource = libElem.source;
+      if (libSource != null) {
+        UriKind uriKind = libSource.uriKind;
+        if (uriKind == UriKind.DART_URI) {
+          suggestion.importUri = libSource.uri.toString();
+        } else if (uriKind == UriKind.PACKAGE_URI) {
+          suggestion.importUri = libSource.uri.toString();
+        } else if (uriKind == UriKind.FILE_URI &&
+            element.source.uriKind == UriKind.FILE_URI) {
+          try {
+            suggestion.importUri =
+                path.relative(libSource.fullName, from: srcPath);
+          } catch (_) {
+            // ignored
+          }
+        }
+      }
+    }
+    if (suggestion.importUri == null) {
+      // Do not include out of scope suggestions
+      // for which we cannot determine an import
+      return null;
+    }
+  }
   return suggestion;
 }
 
@@ -125,12 +157,13 @@
 /**
  * Starting with the given class node, traverse the inheritence hierarchy
  * calling the given functions with each non-null non-empty inherited class
- * declaration. For each locally defined class declaration, call [local].
+ * declaration. For each locally defined declaration, call [localDeclaration].
  * For each class identifier in the hierarchy that is not defined locally,
- * call the [imported] function.
+ * call the [importedTypeName] function.
  */
 void visitInheritedTypes(ClassDeclaration node,
-    void local(ClassDeclaration classNode), void imported(String typeName)) {
+    {void localDeclaration(ClassDeclaration classNode),
+    void importedTypeName(String typeName)}) {
   CompilationUnit unit = node.getAncestor((p) => p is CompilationUnit);
   List<ClassDeclaration> todo = new List<ClassDeclaration>();
   todo.add(node);
@@ -149,10 +182,14 @@
           return false;
         }, orElse: () => null);
         if (classNode is ClassDeclaration) {
-          local(classNode);
+          if (localDeclaration != null) {
+            localDeclaration(classNode);
+          }
           todo.add(classNode);
         } else {
-          imported(name);
+          if (importedTypeName != null) {
+            importedTypeName(name);
+          }
         }
       }
     });
diff --git a/dart/pkg/analysis_server/lib/src/services/correction/assist.dart b/dart/pkg/analysis_server/lib/src/services/correction/assist.dart
index f84e1f7..8234ed8 100644
--- a/dart/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/dart/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -4,43 +4,43 @@
 
 library services.correction.assist;
 
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analyzer/src/generated/ast.dart';
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /**
- * Computes [Assist]s at the given location.
- *
- * Returns the computed [Assist]s, not `null`.
+ * Compute and return the assists available at the given selection (described by
+ * the [offset] and [length]) in the given [source]. The source was analyzed in
+ * the given [context]. The [plugin] is used to get the list of assist
+ * contributors.
  */
-List<Assist> computeAssists(CompilationUnit unit, int offset, int length) {
-  Source source = unit.element.source;
-  String file = source.fullName;
-  AssistProcessor processor =
-      new AssistProcessor(source, file, unit, offset, length);
-  return processor.compute();
-}
-
-/**
- * A description of a single proposed assist.
- */
-class Assist {
-  final AssistKind kind;
-  final SourceChange change;
-
-  Assist(this.kind, this.change);
-
-  @override
-  String toString() {
-    return 'Assist(kind=$kind, change=$change)';
+List<Assist> computeAssists(ServerPlugin plugin, AnalysisContext context,
+    Source source, int offset, int length) {
+  List<Assist> assists = <Assist>[];
+  List<AssistContributor> contributors = plugin.assistContributors;
+  for (AssistContributor contributor in contributors) {
+    try {
+      List<Assist> contributedAssists =
+          contributor.computeAssists(context, source, offset, length);
+      if (contributedAssists != null) {
+        assists.addAll(contributedAssists);
+      }
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          'Exception from assist contributor: ${contributor.runtimeType}',
+          new CaughtException(exception, stackTrace));
+    }
   }
+  assists.sort(Assist.SORT_BY_RELEVANCE);
+  return assists;
 }
 
 /**
- * An enumeration of possible quick assist kinds.
+ * An enumeration of possible assist kinds.
  */
-class AssistKind {
+class DartAssistKind {
   static const ADD_PART_DIRECTIVE =
       const AssistKind('ADD_PART_DIRECTIVE', 30, "Add 'part' directive");
   static const ADD_TYPE_ANNOTATION =
@@ -103,13 +103,4 @@
       'SURROUND_WITH_TRY_FINALLY', 30, "Surround with 'try-finally'");
   static const SURROUND_WITH_WHILE =
       const AssistKind('SURROUND_WITH_WHILE', 30, "Surround with 'while'");
-
-  final name;
-  final int relevance;
-  final String message;
-
-  const AssistKind(this.name, this.relevance, this.message);
-
-  @override
-  String toString() => name;
 }
diff --git a/dart/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/dart/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 324ab85..dbb8255 100644
--- a/dart/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/dart/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -6,6 +6,8 @@
 
 import 'dart:collection';
 
+import 'package:analysis_server/edit/assist/assist_core.dart';
+import 'package:analysis_server/edit/assist/assist_dart.dart';
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
@@ -28,8 +30,8 @@
  * The computer for Dart assists.
  */
 class AssistProcessor {
-  final Source source;
-  final String file;
+  Source source;
+  String file;
   int fileStamp;
   final CompilationUnit unit;
   final int selectionOffset;
@@ -51,8 +53,9 @@
 
   SourceChange change = new SourceChange('<message>');
 
-  AssistProcessor(this.source, this.file, this.unit, this.selectionOffset,
-      this.selectionLength) {
+  AssistProcessor(this.unit, this.selectionOffset, this.selectionLength) {
+    source = unit.element.source;
+    file = source.fullName;
     unitElement = unit.element;
     context = unitElement.context;
     unitLibraryElement = unitElement.library;
@@ -219,7 +222,7 @@
       _addInsertEdit(declaredIdentifier.identifier.offset, '$typeSource ');
     }
     // add proposal
-    _addAssist(AssistKind.ADD_TYPE_ANNOTATION, []);
+    _addAssist(DartAssistKind.ADD_TYPE_ANNOTATION, []);
   }
 
   void _addProposal_addTypeAnnotation_SimpleFormalParameter() {
@@ -262,7 +265,7 @@
     // add edit
     _addInsertEdit(name.offset, '$typeSource ');
     // add proposal
-    _addAssist(AssistKind.ADD_TYPE_ANNOTATION, []);
+    _addAssist(DartAssistKind.ADD_TYPE_ANNOTATION, []);
   }
 
   void _addProposal_addTypeAnnotation_VariableDeclaration() {
@@ -322,7 +325,7 @@
       _addInsertEdit(variable.offset, '$typeSource ');
     }
     // add proposal
-    _addAssist(AssistKind.ADD_TYPE_ANNOTATION, []);
+    _addAssist(DartAssistKind.ADD_TYPE_ANNOTATION, []);
   }
 
   void _addProposal_assignToLocalVariable() {
@@ -384,7 +387,7 @@
     builder.append(' = ');
     // add proposal
     _insertBuilder(builder);
-    _addAssist(AssistKind.ASSIGN_TO_LOCAL_VARIABLE, []);
+    _addAssist(DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE, []);
   }
 
   void _addProposal_convertToBlockFunctionBody() {
@@ -403,7 +406,7 @@
     String newBodySource = '{$eol$prefix$indent$returnSource;$eol$prefix}';
     _addReplaceEdit(rangeNode(body), newBodySource);
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_BLOCK_BODY, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_BLOCK_BODY, []);
   }
 
   void _addProposal_convertToExpressionFunctionBody() {
@@ -438,7 +441,7 @@
     }
     _addReplaceEdit(rangeNode(body), newBodySource);
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_EXPRESSION_BODY, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, []);
   }
 
   void _addProposal_convertToForIndexLoop() {
@@ -513,7 +516,7 @@
     _addInsertEdit(firstBlockLine,
         '$prefix$indent$loopVariable = $listName[$indexName];$eol');
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_FOR_INDEX, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_FOR_INDEX, []);
   }
 
   void _addProposal_convertToIsNot_onIs() {
@@ -562,7 +565,7 @@
     }
     _addInsertEdit(isExpression.isOperator.end, '!');
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_IS_NOT, []);
   }
 
   void _addProposal_convertToIsNot_onNot() {
@@ -611,7 +614,7 @@
     }
     _addInsertEdit(isExpression.isOperator.end, '!');
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_IS_NOT, []);
   }
 
   /**
@@ -668,7 +671,7 @@
     _addRemoveEdit(rangeStartStart(prefixExpression, prefixExpression.operand));
     _addReplaceEdit(rangeNode(isEmptyIdentifier), 'isNotEmpty');
     // add proposal
-    _addAssist(AssistKind.CONVERT_INTO_IS_NOT_EMPTY, []);
+    _addAssist(DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY, []);
   }
 
   void _addProposal_encapsulateField() {
@@ -741,7 +744,7 @@
         '  }';
     _addInsertEdit(fieldDeclaraton.end, getterCode + setterCode);
     // add proposal
-    _addAssist(AssistKind.ENCAPSULATE_FIELD, []);
+    _addAssist(DartAssistKind.ENCAPSULATE_FIELD, []);
   }
 
   void _addProposal_exchangeOperands() {
@@ -799,7 +802,7 @@
       }
     }
     // add proposal
-    _addAssist(AssistKind.EXCHANGE_OPERANDS, []);
+    _addAssist(DartAssistKind.EXCHANGE_OPERANDS, []);
   }
 
   void _addProposal_importAddShow() {
@@ -841,7 +844,7 @@
     String showCombinator = ' show ${StringUtils.join(referencedNames, ', ')}';
     _addInsertEdit(importDirective.end - 1, showCombinator);
     // add proposal
-    _addAssist(AssistKind.IMPORT_ADD_SHOW, []);
+    _addAssist(DartAssistKind.IMPORT_ADD_SHOW, []);
   }
 
   void _addProposal_introduceLocalTestedType() {
@@ -919,7 +922,7 @@
     builder.setExitOffset();
     // add proposal
     _insertBuilder(builder);
-    _addAssist(AssistKind.INTRODUCE_LOCAL_CAST_TYPE, []);
+    _addAssist(DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, []);
   }
 
   void _addProposal_invertIf() {
@@ -943,7 +946,7 @@
     _addReplaceEdit(rangeNode(thenStatement), elseSource);
     _addReplaceEdit(rangeNode(elseStatement), thenSource);
     // add proposal
-    _addAssist(AssistKind.INVERT_IF_STATEMENT, []);
+    _addAssist(DartAssistKind.INVERT_IF_STATEMENT, []);
   }
 
   void _addProposal_joinIfStatementInner() {
@@ -1003,7 +1006,7 @@
           'if ($condition) {$eol$newSource$prefix}');
     }
     // done
-    _addAssist(AssistKind.JOIN_IF_WITH_INNER, []);
+    _addAssist(DartAssistKind.JOIN_IF_WITH_INNER, []);
   }
 
   void _addProposal_joinIfStatementOuter() {
@@ -1065,7 +1068,7 @@
           'if ($condition) {$eol$newSource$prefix}');
     }
     // done
-    _addAssist(AssistKind.JOIN_IF_WITH_OUTER, []);
+    _addAssist(DartAssistKind.JOIN_IF_WITH_OUTER, []);
   }
 
   void _addProposal_joinVariableDeclaration_onAssignment() {
@@ -1135,7 +1138,7 @@
       _addReplaceEdit(rangeEndStart(declNode, assignOffset), ' ');
     }
     // add proposal
-    _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
+    _addAssist(DartAssistKind.JOIN_VARIABLE_DECLARATION, []);
   }
 
   void _addProposal_joinVariableDeclaration_onDeclaration() {
@@ -1197,7 +1200,7 @@
       _addReplaceEdit(rangeEndStart(decl.name, assignOffset), ' ');
     }
     // add proposal
-    _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
+    _addAssist(DartAssistKind.JOIN_VARIABLE_DECLARATION, []);
   }
 
   void _addProposal_removeTypeAnnotation() {
@@ -1246,7 +1249,7 @@
       _addReplaceEdit(typeRange, 'var ');
     }
     // add proposal
-    _addAssist(AssistKind.REMOVE_TYPE_ANNOTATION, []);
+    _addAssist(DartAssistKind.REMOVE_TYPE_ANNOTATION, []);
   }
 
   void _addProposal_replaceConditionalWithIfElse() {
@@ -1343,7 +1346,7 @@
       _addReplaceEdit(rangeNode(statement), src);
     }
     // add proposal
-    _addAssist(AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, []);
+    _addAssist(DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, []);
   }
 
   void _addProposal_replaceIfElseWithConditional() {
@@ -1391,7 +1394,7 @@
       }
     }
     // add proposal
-    _addAssist(AssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL, []);
+    _addAssist(DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL, []);
   }
 
   void _addProposal_splitAndCondition() {
@@ -1480,7 +1483,7 @@
       _addIndentEdit(linesRange, thenIndentOld, thenIndentNew);
     }
     // add proposal
-    _addAssist(AssistKind.SPLIT_AND_CONDITION, []);
+    _addAssist(DartAssistKind.SPLIT_AND_CONDITION, []);
   }
 
   void _addProposal_splitVariableDeclaration() {
@@ -1513,7 +1516,7 @@
     SourceRange assignRange = rangeEndLength(statement, 0);
     _addReplaceEdit(assignRange, eol + indent + name + ' = ' + initSrc + ';');
     // add proposal
-    _addAssist(AssistKind.SPLIT_VARIABLE_DECLARATION, []);
+    _addAssist(DartAssistKind.SPLIT_VARIABLE_DECLARATION, []);
   }
 
   void _addProposal_surroundWith() {
@@ -1556,7 +1559,7 @@
       _addInsertEdit(statementsRange.end, '$indentOld}$eol');
       exitPosition = _newPosition(lastStatement.end);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_BLOCK, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_BLOCK, []);
     }
     // "if"
     {
@@ -1578,7 +1581,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_IF, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_IF, []);
     }
     // "while"
     {
@@ -1600,7 +1603,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_WHILE, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_WHILE, []);
     }
     // "for-in"
     {
@@ -1628,7 +1631,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_FOR_IN, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_FOR_IN, []);
     }
     // "for"
     {
@@ -1668,7 +1671,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_FOR, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_FOR, []);
     }
     // "do-while"
     {
@@ -1690,7 +1693,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_DO_WHILE, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_DO_WHILE, []);
     }
     // "try-catch"
     {
@@ -1730,7 +1733,7 @@
       sb.append(eol);
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_TRY_CATCH, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_TRY_CATCH, []);
     }
     // "try-finally"
     {
@@ -1763,7 +1766,7 @@
       //
       _insertBuilder(sb, statementsRange.length);
       // add proposal
-      _addAssist(AssistKind.SURROUND_WITH_TRY_FINALLY, []);
+      _addAssist(DartAssistKind.SURROUND_WITH_TRY_FINALLY, []);
     }
   }
 
@@ -1904,6 +1907,18 @@
   }
 }
 
+/**
+ * An [AssistContributor] that provides the default set of assists.
+ */
+class DefaultAssistContributor extends DartAssistContributor {
+  @override
+  List<Assist> internalComputeAssists(
+      CompilationUnit unit, int offset, int length) {
+    AssistProcessor processor = new AssistProcessor(unit, offset, length);
+    return processor.compute();
+  }
+}
+
 class _SimpleIdentifierRecursiveAstVisitor extends RecursiveAstVisitor {
   final _SimpleIdentifierVisitor visitor;
 
diff --git a/dart/pkg/analysis_server/lib/src/services/correction/fix.dart b/dart/pkg/analysis_server/lib/src/services/correction/fix.dart
index beb3367..3de01d3 100644
--- a/dart/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/dart/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -2,46 +2,43 @@
 // 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.correction.fix;
+library analysis_server.src.services.correction.fix;
 
-import 'package:analysis_server/src/protocol.dart' show SourceChange;
-import 'package:analysis_server/src/services/correction/fix_internal.dart';
-import 'package:analyzer/src/generated/ast.dart';
+import 'package:analysis_server/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 
 /**
- * Computes [Fix]s for the given [AnalysisError].
- *
- * Returns the computed [Fix]s, not `null`.
+ * Compute and return the fixes available for the given [error]. The error was
+ * reported after it's source was analyzed in the given [context]. The [plugin]
+ * is used to get the list of fix contributors.
  */
-List<Fix> computeFixes(CompilationUnit unit, AnalysisError error) {
-  var processor = new FixProcessor(unit, error);
-  List<Fix> fixes = processor.compute();
-  fixes.sort((Fix a, Fix b) {
-    return a.kind.relevance - b.kind.relevance;
-  });
-  return fixes;
-}
-
-/**
- * A description of a single proposed fix for some problem.
- */
-class Fix {
-  final FixKind kind;
-  final SourceChange change;
-
-  Fix(this.kind, this.change);
-
-  @override
-  String toString() {
-    return '[kind=$kind, change=$change]';
+List<Fix> computeFixes(
+    ServerPlugin plugin, AnalysisContext context, AnalysisError error) {
+  List<Fix> fixes = <Fix>[];
+  List<FixContributor> contributors = plugin.fixContributors;
+  for (FixContributor contributor in contributors) {
+    try {
+      List<Fix> contributedFixes = contributor.computeFixes(context, error);
+      if (contributedFixes != null) {
+        fixes.addAll(contributedFixes);
+      }
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          'Exception from fix contributor: ${contributor.runtimeType}',
+          new CaughtException(exception, stackTrace));
+    }
   }
+  fixes.sort(Fix.SORT_BY_RELEVANCE);
+  return fixes;
 }
 
 /**
  * An enumeration of possible quick fix kinds.
  */
-class FixKind {
+class DartFixKind {
   static const ADD_ASYNC =
       const FixKind('ADD_ASYNC', 50, "Add 'async' modifier");
   static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind(
@@ -91,6 +88,8 @@
       const FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
   static const MAKE_CLASS_ABSTRACT =
       const FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
+  static const REMOVE_DEAD_CODE =
+      const FixKind('REMOVE_DEAD_CODE', 50, "Remove dead code");
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = const FixKind(
       'REMOVE_PARAMETERS_IN_GETTER_DECLARATION', 50,
       "Remove parameters in getter declaration");
@@ -99,8 +98,8 @@
       "Remove parentheses in getter invocation");
   static const REMOVE_UNNECASSARY_CAST =
       const FixKind('REMOVE_UNNECASSARY_CAST', 50, "Remove unnecessary cast");
-  static const REMOVE_UNUSED_CATCH_CLAUSE = const FixKind(
-      'REMOVE_UNUSED_CATCH', 50, "Remove unused 'catch' clause");
+  static const REMOVE_UNUSED_CATCH_CLAUSE =
+      const FixKind('REMOVE_UNUSED_CATCH', 50, "Remove unused 'catch' clause");
   static const REMOVE_UNUSED_CATCH_STACK = const FixKind(
       'REMOVE_UNUSED_CATCH_STACK', 50, "Remove unused stack trace variable");
   static const REMOVE_UNUSED_IMPORT =
@@ -122,13 +121,4 @@
       const FixKind('USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'");
   static const USE_NOT_EQ_NULL =
       const FixKind('USE_NOT_EQ_NULL', 50, "Use != null instead of 'is! Null'");
-
-  final name;
-  final int relevance;
-  final String message;
-
-  const FixKind(this.name, this.relevance, this.message);
-
-  @override
-  String toString() => name;
 }
diff --git a/dart/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/dart/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index f38c00c..9ae3c0e 100644
--- a/dart/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/dart/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -2,10 +2,12 @@
 // 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.correction.fix;
+library analysis_server.src.services.correction.fix_internal;
 
 import 'dart:collection';
 
+import 'package:analysis_server/edit/fix/fix_core.dart';
+import 'package:analysis_server/edit/fix/fix_dart.dart';
 import 'package:analysis_server/src/protocol.dart'
     hide AnalysisError, Element, ElementKind;
 import 'package:analysis_server/src/protocol_server.dart'
@@ -38,6 +40,17 @@
 typedef bool ElementPredicate(Element argument);
 
 /**
+ * A [FixContributor] that provides the default set of fixes.
+ */
+class DefaultFixContributor extends DartFixContributor {
+  @override
+  List<Fix> internalComputeFixes(CompilationUnit unit, AnalysisError error) {
+    FixProcessor processor = new FixProcessor(unit, error);
+    return processor.compute();
+  }
+}
+
+/**
  * The computer for Dart fixes.
  */
 class FixProcessor {
@@ -66,6 +79,7 @@
   int errorOffset;
   int errorLength;
   int errorEnd;
+  SourceRange errorRange;
   AstNode node;
   AstNode coveredNode;
 
@@ -92,6 +106,7 @@
     errorOffset = error.offset;
     errorLength = error.length;
     errorEnd = errorOffset + errorLength;
+    errorRange = new SourceRange(errorOffset, errorLength);
     node = new NodeLocator.con1(errorOffset).searchWithin(unit);
     coveredNode = new NodeLocator.con2(errorOffset, errorOffset + errorLength)
         .searchWithin(unit);
@@ -137,6 +152,9 @@
       _addFix_createPartUri();
       _addFix_replaceImportUri();
     }
+    if (errorCode == HintCode.DEAD_CODE) {
+      _addFix_removeDeadCode();
+    }
     if (errorCode == HintCode.DIVISION_OPTIMIZATION) {
       _addFix_useEffectiveIntegerDivision();
     }
@@ -317,9 +335,9 @@
     AstNode node = this.node;
     if (_isAwaitNode()) {
       FunctionBody body = node.getAncestor((n) => n is FunctionBody);
-      if (body.keyword == null) {
+      if (body != null && body.keyword == null) {
         _addReplaceEdit(rf.rangeStartLength(body, 0), 'async ');
-        _addFix(FixKind.ADD_ASYNC, []);
+        _addFix(DartFixKind.ADD_ASYNC, []);
         return true;
       }
     }
@@ -329,7 +347,7 @@
   void _addFix_boolInsteadOfBoolean() {
     SourceRange range = rf.rangeError(error);
     _addReplaceEdit(range, 'bool');
-    _addFix(FixKind.REPLACE_BOOLEAN_WITH_BOOL, []);
+    _addFix(DartFixKind.REPLACE_BOOLEAN_WITH_BOOL, []);
   }
 
   void _addFix_createClass() {
@@ -362,7 +380,7 @@
       _insertBuilder(sb, unitElement);
       _addLinkedPosition('NAME', sb, rf.rangeNode(node));
       // add proposal
-      _addFix(FixKind.CREATE_CLASS, [name]);
+      _addFix(DartFixKind.CREATE_CLASS, [name]);
     }
   }
 
@@ -409,7 +427,7 @@
     // insert source
     _insertBuilder(sb, unitElement);
     // add proposal
-    _addFix(FixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, []);
+    _addFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, []);
   }
 
   void _addFix_createConstructor_insteadOfSyntheticDefault() {
@@ -471,7 +489,7 @@
     // insert source
     _insertBuilder(sb, targetElement);
     // add proposal
-    _addFix(FixKind.CREATE_CONSTRUCTOR, [constructorName]);
+    _addFix(DartFixKind.CREATE_CONSTRUCTOR, [constructorName]);
   }
 
   void _addFix_createConstructor_named() {
@@ -535,7 +553,7 @@
       _addLinkedPosition('NAME', sb, rf.rangeNode(name));
     }
     // add proposal
-    _addFix(FixKind.CREATE_CONSTRUCTOR, [constructorName]);
+    _addFix(DartFixKind.CREATE_CONSTRUCTOR, [constructorName]);
   }
 
   void _addFix_createConstructorSuperExplicit() {
@@ -601,7 +619,7 @@
       _insertBuilder(sb, unitElement);
       // add proposal
       String proposalName = _getConstructorProposalName(superConstructor);
-      _addFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, [proposalName]);
+      _addFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, [proposalName]);
     }
   }
 
@@ -673,7 +691,7 @@
       _insertBuilder(sb, unitElement);
       // add proposal
       String proposalName = _getConstructorProposalName(superConstructor);
-      _addFix(FixKind.CREATE_CONSTRUCTOR_SUPER, [proposalName]);
+      _addFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, [proposalName]);
     }
   }
 
@@ -708,6 +726,9 @@
       if (target is Identifier) {
         Identifier targetIdentifier = target;
         Element targetElement = targetIdentifier.staticElement;
+        if (targetElement == null) {
+          return;
+        }
         staticModifier = targetElement.kind == ElementKind.CLASS;
       }
     } else {
@@ -755,7 +776,7 @@
       _addLinkedPosition('NAME', sb, rf.rangeNode(node));
     }
     // add proposal
-    _addFix(FixKind.CREATE_FIELD, [name]);
+    _addFix(DartFixKind.CREATE_FIELD, [name]);
   }
 
   void _addFix_createFunction_forFunctionType() {
@@ -889,7 +910,7 @@
       _addLinkedPosition('NAME', sb, rf.rangeNode(node));
     }
     // add proposal
-    _addFix(FixKind.CREATE_GETTER, [name]);
+    _addFix(DartFixKind.CREATE_GETTER, [name]);
   }
 
   void _addFix_createImportUri() {
@@ -905,7 +926,7 @@
           change.addEdit(file, -1, edit);
           doSourceChange_addSourceEdit(change, context, source, edit);
         }
-        _addFix(FixKind.CREATE_FILE, [file]);
+        _addFix(DartFixKind.CREATE_FILE, [file]);
       }
     }
   }
@@ -923,7 +944,7 @@
           assignment.operator.type == TokenType.EQ &&
           assignment.parent is ExpressionStatement) {
         _addInsertEdit(node.offset, 'var ');
-        _addFix(FixKind.CREATE_LOCAL_VARIABLE, [name]);
+        _addFix(DartFixKind.CREATE_LOCAL_VARIABLE, [name]);
         return;
       }
     }
@@ -961,7 +982,7 @@
     // add linked positions
     _addLinkedPosition('NAME', sb, rf.rangeNode(node));
     // add proposal
-    _addFix(FixKind.CREATE_LOCAL_VARIABLE, [name]);
+    _addFix(DartFixKind.CREATE_LOCAL_VARIABLE, [name]);
   }
 
   void _addFix_createMissingOverrides(List<ExecutableElement> elements) {
@@ -1018,7 +1039,7 @@
     // add proposal
     exitPosition = new Position(file, insertOffset);
     _insertBuilder(sb, unitElement);
-    _addFix(FixKind.CREATE_MISSING_OVERRIDES, [numElements]);
+    _addFix(DartFixKind.CREATE_MISSING_OVERRIDES, [numElements]);
   }
 
   void _addFix_createMissingOverrides_single(SourceBuilder sb,
@@ -1096,7 +1117,7 @@
     _insertBuilder(sb, unitElement);
     exitPosition = new Position(file, insertOffset);
     // add proposal
-    _addFix(FixKind.CREATE_NO_SUCH_METHOD, []);
+    _addFix(DartFixKind.CREATE_NO_SUCH_METHOD, []);
   }
 
   void _addFix_createPartUri() {
@@ -1109,7 +1130,7 @@
         SourceEdit edit = new SourceEdit(0, 0, 'part of $libName;$eol$eol');
         change.addEdit(file, -1, edit);
         doSourceChange_addSourceEdit(change, context, source, edit);
-        _addFix(FixKind.CREATE_FILE, [file]);
+        _addFix(DartFixKind.CREATE_FILE, [file]);
       }
     }
   }
@@ -1129,7 +1150,7 @@
     }
     _addReplaceEdit(rf.rangeNode(typeName), returnTypeCode);
     // add proposal
-    _addFix(FixKind.REPLACE_RETURN_TYPE_FUTURE, []);
+    _addFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, []);
   }
 
   void _addFix_importLibrary(FixKind kind, String importPath) {
@@ -1173,7 +1194,6 @@
     if (name.startsWith('_')) {
       return;
     }
-
     // may be there is an existing import,
     // but it is with prefix and we don't use this prefix
     for (ImportElement imp in unitLibraryElement.imports) {
@@ -1194,7 +1214,7 @@
       if (prefix != null) {
         SourceRange range = rf.rangeStartLength(node, 0);
         _addReplaceEdit(range, '${prefix.displayName}.');
-        _addFix(FixKind.IMPORT_LIBRARY_PREFIX, [
+        _addFix(DartFixKind.IMPORT_LIBRARY_PREFIX, [
           libraryElement.displayName,
           prefix.displayName
         ]);
@@ -1218,7 +1238,7 @@
         String newShowCode = 'show ${StringUtils.join(showNames, ", ")}';
         _addReplaceEdit(
             rf.rangeOffsetEnd(showCombinator), newShowCode, unitLibraryElement);
-        _addFix(FixKind.IMPORT_LIBRARY_SHOW, [libraryName]);
+        _addFix(DartFixKind.IMPORT_LIBRARY_SHOW, [libraryName]);
         // we support only one import without prefix
         return;
       }
@@ -1250,7 +1270,7 @@
           continue;
         }
         // add import
-        _addFix_importLibrary(FixKind.IMPORT_LIBRARY_SDK, libraryUri);
+        _addFix_importLibrary(DartFixKind.IMPORT_LIBRARY_SDK, libraryUri);
       }
     }
     // check project libraries
@@ -1285,14 +1305,14 @@
           String libraryPackageUri = findAbsoluteUri(context, libraryFile);
           if (libraryPackageUri != null) {
             _addFix_importLibrary(
-                FixKind.IMPORT_LIBRARY_PROJECT, libraryPackageUri);
+                DartFixKind.IMPORT_LIBRARY_PROJECT, libraryPackageUri);
             continue;
           }
         }
         // relative URI
         String relativeFile = relative(libraryFile, from: unitLibraryFolder);
         relativeFile = split(relativeFile).join('/');
-        _addFix_importLibrary(FixKind.IMPORT_LIBRARY_PROJECT, relativeFile);
+        _addFix_importLibrary(DartFixKind.IMPORT_LIBRARY_PROJECT, relativeFile);
       }
     }
   }
@@ -1330,7 +1350,7 @@
       }
       int insertOffset = error.offset + error.length;
       _addInsertEdit(insertOffset, ';');
-      _addFix(FixKind.INSERT_SEMICOLON, []);
+      _addFix(DartFixKind.INSERT_SEMICOLON, []);
     }
   }
 
@@ -1339,7 +1359,7 @@
       IsExpression isExpression = coveredNode as IsExpression;
       _addReplaceEdit(
           rf.rangeEndEnd(isExpression.expression, isExpression), ' != null');
-      _addFix(FixKind.USE_NOT_EQ_NULL, []);
+      _addFix(DartFixKind.USE_NOT_EQ_NULL, []);
     }
   }
 
@@ -1348,7 +1368,7 @@
       IsExpression isExpression = coveredNode as IsExpression;
       _addReplaceEdit(
           rf.rangeEndEnd(isExpression.expression, isExpression), ' == null');
-      _addFix(FixKind.USE_EQ_EQ_NULL, []);
+      _addFix(DartFixKind.USE_EQ_EQ_NULL, []);
     }
   }
 
@@ -1357,7 +1377,39 @@
         node.getAncestor((node) => node is ClassDeclaration);
     String className = enclosingClass.name.name;
     _addInsertEdit(enclosingClass.classKeyword.offset, 'abstract ');
-    _addFix(FixKind.MAKE_CLASS_ABSTRACT, [className]);
+    _addFix(DartFixKind.MAKE_CLASS_ABSTRACT, [className]);
+  }
+
+  void _addFix_removeDeadCode() {
+    AstNode coveringNode = this.coveredNode;
+    if (coveringNode is Expression) {
+      AstNode parent = coveredNode.parent;
+      if (parent is BinaryExpression) {
+        if (parent.rightOperand == coveredNode) {
+          _addRemoveEdit(rf.rangeEndEnd(parent.leftOperand, coveredNode));
+          _addFix(DartFixKind.REMOVE_DEAD_CODE, []);
+        }
+      }
+    } else if (coveringNode is Block) {
+      Block block = coveringNode;
+      List<Statement> statementsToRemove = <Statement>[];
+      for (Statement statement in block.statements) {
+        if (rf.rangeNode(statement).intersects(errorRange)) {
+          statementsToRemove.add(statement);
+        }
+      }
+      if (statementsToRemove.isNotEmpty) {
+        SourceRange rangeToRemove =
+            utils.getLinesRangeStatements(statementsToRemove);
+        _addRemoveEdit(rangeToRemove);
+        _addFix(DartFixKind.REMOVE_DEAD_CODE, []);
+      }
+    } else if (coveringNode is Statement) {
+      SourceRange rangeToRemove =
+          utils.getLinesRangeStatements(<Statement>[coveringNode]);
+      _addRemoveEdit(rangeToRemove);
+      _addFix(DartFixKind.REMOVE_DEAD_CODE, []);
+    }
   }
 
   void _addFix_removeParameters_inGetterDeclaration() {
@@ -1366,7 +1418,7 @@
       FunctionBody body = method.body;
       if (method.name == node && body != null) {
         _addReplaceEdit(rf.rangeEndStart(node, body), ' ');
-        _addFix(FixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, []);
+        _addFix(DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, []);
       }
     }
   }
@@ -1376,7 +1428,7 @@
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.methodName == node && invocation.target != null) {
         _addRemoveEdit(rf.rangeEndEnd(node, invocation));
-        _addFix(FixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION, []);
+        _addFix(DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION, []);
       }
     }
   }
@@ -1392,7 +1444,7 @@
     _addRemoveEdit(rf.rangeEndEnd(expression, asExpression));
     _removeEnclosingParentheses(asExpression, expressionPrecedence);
     // done
-    _addFix(FixKind.REMOVE_UNNECASSARY_CAST, []);
+    _addFix(DartFixKind.REMOVE_UNNECASSARY_CAST, []);
   }
 
   void _addFix_removeUnusedCatchClause() {
@@ -1402,7 +1454,7 @@
           catchClause.exceptionParameter == node) {
         _addRemoveEdit(
             rf.rangeStartStart(catchClause.catchKeyword, catchClause.body));
-        _addFix(FixKind.REMOVE_UNUSED_CATCH_CLAUSE, []);
+        _addFix(DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE, []);
       }
     }
   }
@@ -1414,7 +1466,7 @@
           catchClause.stackTraceParameter == node &&
           catchClause.exceptionParameter != null) {
         _addRemoveEdit(rf.rangeEndEnd(catchClause.exceptionParameter, node));
-        _addFix(FixKind.REMOVE_UNUSED_CATCH_STACK, []);
+        _addFix(DartFixKind.REMOVE_UNUSED_CATCH_STACK, []);
       }
     }
   }
@@ -1429,7 +1481,7 @@
     // remove the whole line with import
     _addRemoveEdit(utils.getLinesRange(rf.rangeNode(importDirective)));
     // done
-    _addFix(FixKind.REMOVE_UNUSED_IMPORT, []);
+    _addFix(DartFixKind.REMOVE_UNUSED_IMPORT, []);
   }
 
   void _addFix_replaceImportUri() {
@@ -1452,7 +1504,7 @@
           // add fix
           SourceRange range = rf.rangeNode(node);
           _addReplaceEdit(range, "'$fixedUri'");
-          _addFix(FixKind.REPLACE_IMPORT_URI, [fixedUri]);
+          _addFix(DartFixKind.REPLACE_IMPORT_URI, [fixedUri]);
         }
       }
     }
@@ -1461,14 +1513,14 @@
   void _addFix_replaceVarWithDynamic() {
     SourceRange range = rf.rangeError(error);
     _addReplaceEdit(range, 'dynamic');
-    _addFix(FixKind.REPLACE_VAR_WITH_DYNAMIC, []);
+    _addFix(DartFixKind.REPLACE_VAR_WITH_DYNAMIC, []);
   }
 
   void _addFix_replaceWithConstInstanceCreation() {
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
       _addReplaceEdit(rf.rangeToken(instanceCreation.keyword), 'const');
-      _addFix(FixKind.USE_CONST, []);
+      _addFix(DartFixKind.USE_CONST, []);
     }
   }
 
@@ -1498,7 +1550,7 @@
         _addReplaceEdit(rf.rangeNode(node), closestName);
         // add proposal
         if (closestName != null) {
-          _addFix(FixKind.CHANGE_TO, [closestName]);
+          _addFix(DartFixKind.CHANGE_TO, [closestName]);
         }
       }
     }
@@ -1555,7 +1607,7 @@
       if (finder._element != null) {
         String closestName = finder._element.name;
         _addReplaceEdit(rf.rangeNode(node), closestName);
-        _addFix(FixKind.CHANGE_TO, [closestName]);
+        _addFix(DartFixKind.CHANGE_TO, [closestName]);
       }
     }
   }
@@ -1602,7 +1654,7 @@
     _insertBuilder(sb, unitElement);
     _addLinkedPosition('NAME', sb, rf.rangeNode(node));
     // add proposal
-    _addFix(FixKind.CREATE_FUNCTION, [name]);
+    _addFix(DartFixKind.CREATE_FUNCTION, [name]);
   }
 
   void _addFix_undefinedFunction_useSimilar() {
@@ -1626,7 +1678,7 @@
       if (finder._element != null) {
         String closestName = finder._element.name;
         _addReplaceEdit(rf.rangeNode(node), closestName);
-        _addFix(FixKind.CHANGE_TO, [closestName]);
+        _addFix(DartFixKind.CHANGE_TO, [closestName]);
       }
     }
   }
@@ -1710,7 +1762,7 @@
         _addLinkedPosition('NAME', sb, rf.rangeNode(node));
       }
       // add proposal
-      _addFix(FixKind.CREATE_METHOD, [name]);
+      _addFix(DartFixKind.CREATE_METHOD, [name]);
     }
   }
 
@@ -1794,7 +1846,7 @@
         _addInsertEdit(offset, fieldParametersCode);
       }
       // add proposal
-      _addFix(FixKind.ADD_FIELD_FORMAL_PARAMETERS, []);
+      _addFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, []);
     }
   }
 
@@ -1814,7 +1866,7 @@
         _addRemoveEdit(rf.rangeStartStart(n, binary.leftOperand));
         _addRemoveEdit(rf.rangeEndEnd(binary.rightOperand, n));
         // add proposal
-        _addFix(FixKind.USE_EFFECTIVE_INTEGER_DIVISION, []);
+        _addFix(DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION, []);
         // done
         break;
       }
@@ -1835,7 +1887,7 @@
       SourceRange range = rf.rangeNode(target);
       _addReplaceEdit(range, declaringTypeCode);
       // add proposal
-      _addFix(FixKind.CHANGE_TO_STATIC_ACCESS, [declaringType]);
+      _addFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, [declaringType]);
     }
   }
 
@@ -1875,7 +1927,7 @@
   void _addLinkedPosition(String groupId, SourceBuilder sb, SourceRange range) {
     // prepare offset
     int offset = range.offset;
-    if (sb.offset < offset) {
+    if (sb.offset <= offset) {
       int delta = sb.length;
       offset += delta;
     }
@@ -1967,7 +2019,7 @@
     _addProposal_createFunction(functionType, name, unitSource, insertOffset,
         false, prefix, sourcePrefix, sourceSuffix, unitElement);
     // add proposal
-    _addFix(FixKind.CREATE_FUNCTION, [name]);
+    _addFix(DartFixKind.CREATE_FUNCTION, [name]);
   }
 
   /**
@@ -1996,7 +2048,7 @@
         _inStaticContext(), prefix, sourcePrefix, sourceSuffix,
         targetClassElement);
     // add proposal
-    _addFix(FixKind.CREATE_METHOD, [name]);
+    _addFix(DartFixKind.CREATE_METHOD, [name]);
   }
 
   /**
diff --git a/dart/pkg/analysis_server/lib/src/services/index/index.dart b/dart/pkg/analysis_server/lib/src/services/index/index.dart
index c033fd6..4582ac8 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/index.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/index.dart
@@ -50,8 +50,8 @@
    * [relationship] - the relationship between the given element and the
    * locations to be returned.
    */
-  Future<List<Location>> getRelationships(
-      Element element, Relationship relationship);
+  Future<List<LocationImpl>> getRelationships(
+      Element element, RelationshipImpl relationship);
 
   /**
    * Returns top-level [Element]s whose names satisfy to [nameFilter].
@@ -131,98 +131,100 @@
    *   Defines an Element.
    * Right: an Element declaration.
    */
-  static final Relationship DEFINES = Relationship.getRelationship("defines");
+  static final RelationshipImpl DEFINES =
+      RelationshipImpl.getRelationship("defines");
 
   /**
    * Left: class.
    *   Is extended by.
    * Right: other class declaration.
    */
-  static final Relationship IS_EXTENDED_BY =
-      Relationship.getRelationship("is-extended-by");
+  static final RelationshipImpl IS_EXTENDED_BY =
+      RelationshipImpl.getRelationship("is-extended-by");
 
   /**
    * Left: class.
    *   Is implemented by.
    * Right: other class declaration.
    */
-  static final Relationship IS_IMPLEMENTED_BY =
-      Relationship.getRelationship("is-implemented-by");
+  static final RelationshipImpl IS_IMPLEMENTED_BY =
+      RelationshipImpl.getRelationship("is-implemented-by");
 
   /**
    * Left: class.
    *   Is mixed into.
    * Right: other class declaration.
    */
-  static final Relationship IS_MIXED_IN_BY =
-      Relationship.getRelationship("is-mixed-in-by");
+  static final RelationshipImpl IS_MIXED_IN_BY =
+      RelationshipImpl.getRelationship("is-mixed-in-by");
 
   /**
    * Left: local variable, parameter.
    *   Is read at.
    * Right: location.
    */
-  static final Relationship IS_READ_BY =
-      Relationship.getRelationship("is-read-by");
+  static final RelationshipImpl IS_READ_BY =
+      RelationshipImpl.getRelationship("is-read-by");
 
   /**
    * Left: local variable, parameter.
    *   Is both read and written at.
    * Right: location.
    */
-  static final Relationship IS_READ_WRITTEN_BY =
-      Relationship.getRelationship("is-read-written-by");
+  static final RelationshipImpl IS_READ_WRITTEN_BY =
+      RelationshipImpl.getRelationship("is-read-written-by");
 
   /**
    * Left: local variable, parameter.
    *   Is written at.
    * Right: location.
    */
-  static final Relationship IS_WRITTEN_BY =
-      Relationship.getRelationship("is-written-by");
+  static final RelationshipImpl IS_WRITTEN_BY =
+      RelationshipImpl.getRelationship("is-written-by");
 
   /**
    * Left: function, method, variable, getter.
    *   Is invoked at.
    * Right: location.
    */
-  static final Relationship IS_INVOKED_BY =
-      Relationship.getRelationship("is-invoked-by");
+  static final RelationshipImpl IS_INVOKED_BY =
+      RelationshipImpl.getRelationship("is-invoked-by");
 
   /**
    * Left: function, function type, class, field, method.
    *   Is referenced (and not invoked, read/written) at.
    * Right: location.
    */
-  static final Relationship IS_REFERENCED_BY =
-      Relationship.getRelationship("is-referenced-by");
+  static final RelationshipImpl IS_REFERENCED_BY =
+      RelationshipImpl.getRelationship("is-referenced-by");
 
   /**
    * Left: name element.
    *   Is defined by.
    * Right: concrete element declaration.
    */
-  static final Relationship NAME_IS_DEFINED_BY =
-      Relationship.getRelationship("name-is-defined-by");
+  static final RelationshipImpl NAME_IS_DEFINED_BY =
+      RelationshipImpl.getRelationship("name-is-defined-by");
 
   IndexConstants._();
 }
 
 /**
- * Instances of the class [Location] represent a location related to an element.
+ * Instances of the class [LocationImpl] represent a location related to an
+ * element.
  *
  * The location is expressed as an offset and length, but the offset is relative
  * to the resource containing the element rather than the start of the element
  * within that resource.
  */
-class Location {
+class LocationImpl {
   static const int _FLAG_QUALIFIED = 1 << 0;
   static const int _FLAG_RESOLVED = 1 << 1;
 
   /**
    * An empty array of locations.
    */
-  static const List<Location> EMPTY_ARRAY = const <Location>[];
+  static const List<LocationImpl> EMPTY_ARRAY = const <LocationImpl>[];
 
   /**
    * The element containing this location.
@@ -252,7 +254,7 @@
    * [offset] - the offset within the resource containing [element].
    * [length] - the length of this location
    */
-  Location(this.element, this.offset, this.length,
+  LocationImpl(this.element, this.offset, this.length,
       {bool isQualified: false, bool isResolved: true}) {
     if (element == null) {
       throw new ArgumentError("element location cannot be null");
@@ -290,12 +292,12 @@
 }
 
 /**
- * A [Location] with attached data.
+ * A [LocationImpl] with attached data.
  */
-class LocationWithData<D> extends Location {
+class LocationWithData<D> extends LocationImpl {
   final D data;
 
-  LocationWithData(Location location, this.data)
+  LocationWithData(LocationImpl location, this.data)
       : super(location.element, location.offset, location.length);
 }
 
@@ -317,11 +319,11 @@
  * Relationship between an element and a location. Relationships are identified
  * by a globally unique identifier.
  */
-class Relationship {
+class RelationshipImpl {
   /**
    * A table mapping relationship identifiers to relationships.
    */
-  static Map<String, Relationship> _RELATIONSHIP_MAP = {};
+  static Map<String, RelationshipImpl> _RELATIONSHIP_MAP = {};
 
   /**
    * The next artificial hash code.
@@ -341,7 +343,7 @@
   /**
    * Initialize a newly created relationship with the given unique identifier.
    */
-  Relationship(this.identifier);
+  RelationshipImpl(this.identifier);
 
   @override
   int get hashCode => _hashCode;
@@ -352,10 +354,10 @@
   /**
    * Returns the relationship with the given unique [identifier].
    */
-  static Relationship getRelationship(String identifier) {
-    Relationship relationship = _RELATIONSHIP_MAP[identifier];
+  static RelationshipImpl getRelationship(String identifier) {
+    RelationshipImpl relationship = _RELATIONSHIP_MAP[identifier];
     if (relationship == null) {
-      relationship = new Relationship(identifier);
+      relationship = new RelationshipImpl(identifier);
       _RELATIONSHIP_MAP[identifier] = relationship;
     }
     return relationship;
diff --git a/dart/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/dart/pkg/analysis_server/lib/src/services/index/index_contributor.dart
index d2ac8a7..b5bef6b 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -21,7 +21,7 @@
  * Adds data to [store] based on the resolved Dart [unit].
  */
 void indexDartUnit(
-    IndexStore store, AnalysisContext context, CompilationUnit unit) {
+    InternalIndexStore store, AnalysisContext context, CompilationUnit unit) {
   // check unit
   if (unit == null) {
     return;
@@ -45,7 +45,7 @@
  * Adds data to [store] based on the resolved HTML [unit].
  */
 void indexHtmlUnit(
-    IndexStore store, AnalysisContext context, ht.HtmlUnit unit) {
+    InternalIndexStore store, AnalysisContext context, ht.HtmlUnit unit) {
   // check unit
   if (unit == null) {
     return;
@@ -65,10 +65,10 @@
 }
 
 /**
- * Visits a resolved AST and adds relationships into [IndexStore].
+ * Visits a resolved AST and adds relationships into [InternalIndexStore].
  */
 class _IndexContributor extends GeneralizingAstVisitor {
-  final IndexStore _store;
+  final InternalIndexStore _store;
 
   LibraryElement _libraryElement;
 
@@ -102,10 +102,11 @@
   }
 
   /**
-   * Record the given relationship between the given [Element] and [Location].
+   * Record the given relationship between the given [Element] and
+   * [LocationImpl].
    */
   void recordRelationship(
-      Element element, Relationship relationship, Location location) {
+      Element element, RelationshipImpl relationship, LocationImpl location) {
     if (element != null && location != null) {
       _store.recordRelationship(element, relationship, location);
     }
@@ -229,7 +230,7 @@
     // field reference is write here
     if (fieldName != null) {
       Element element = fieldName.staticElement;
-      Location location = _createLocationForNode(fieldName);
+      LocationImpl location = _createLocationForNode(fieldName);
       _store.recordRelationship(
           element, IndexConstants.IS_WRITTEN_BY, location);
     }
@@ -249,7 +250,7 @@
       element = element.redirectedConstructor;
     }
     // prepare location
-    Location location;
+    LocationImpl location;
     if (node.name != null) {
       int start = node.period.offset;
       int end = node.name.end;
@@ -341,7 +342,8 @@
     MethodElement element = node.bestElement;
     if (element is MethodElement) {
       Token operator = node.leftBracket;
-      Location location = _createLocationForToken(operator, element != null);
+      LocationImpl location =
+          _createLocationForToken(operator, element != null);
       recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
     }
     super.visitIndexExpression(node);
@@ -361,7 +363,7 @@
   @override
   visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
-    Location location = _createLocationForNode(name);
+    LocationImpl location = _createLocationForNode(name);
     // element invocation
     Element element = name.bestElement;
     if (element is MethodElement ||
@@ -383,14 +385,14 @@
   @override
   visitPartDirective(PartDirective node) {
     Element element = node.element;
-    Location location = _createLocationForNode(node.uri);
+    LocationImpl location = _createLocationForNode(node.uri);
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     super.visitPartDirective(node);
   }
 
   @override
   visitPartOfDirective(PartOfDirective node) {
-    Location location = _createLocationForNode(node.libraryName);
+    LocationImpl location = _createLocationForNode(node.libraryName);
     recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
   }
 
@@ -409,7 +411,7 @@
   @override
   visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     ConstructorElement element = node.staticElement;
-    Location location;
+    LocationImpl location;
     if (node.constructorName != null) {
       int start = node.period.offset;
       int end = node.constructorName.end;
@@ -425,7 +427,7 @@
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
     Element nameElement = new NameElement(node.name);
-    Location location = _createLocationForNode(node);
+    LocationImpl location = _createLocationForNode(node);
     // name in declaration
     if (node.inDeclarationContext()) {
       recordRelationship(
@@ -456,7 +458,7 @@
     }
     // this.field parameter
     if (element is FieldFormalParameterElement) {
-      Relationship relationship = peekElement() == element
+      RelationshipImpl relationship = peekElement() == element
           ? IndexConstants.IS_WRITTEN_BY
           : IndexConstants.IS_REFERENCED_BY;
       _store.recordRelationship(element.field, relationship, location);
@@ -496,7 +498,7 @@
   @override
   visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ConstructorElement element = node.staticElement;
-    Location location;
+    LocationImpl location;
     if (node.constructorName != null) {
       int start = node.period.offset;
       int end = node.constructorName.end;
@@ -536,7 +538,7 @@
     // record declaration
     {
       SimpleIdentifier name = node.name;
-      Location location = _createLocationForNode(name);
+      LocationImpl location = _createLocationForNode(name);
       location = _getLocationWithExpressionType(location, node.initializer);
       recordRelationship(element, IndexConstants.NAME_IS_DEFINED_BY, location);
     }
@@ -575,16 +577,16 @@
   }
 
   /**
-   * @return the [Location] representing location of the [AstNode].
+   * @return the [LocationImpl] representing location of the [AstNode].
    */
-  Location _createLocationForNode(AstNode node) {
+  LocationImpl _createLocationForNode(AstNode node) {
     bool isQualified = _isQualifiedClassMemberAccess(node);
     bool isResolved = true;
     if (node is SimpleIdentifier) {
       isResolved = node.bestElement != null;
     }
     Element element = peekElement();
-    return new Location(element, node.offset, node.length,
+    return new LocationImpl(element, node.offset, node.length,
         isQualified: isQualified, isResolved: isResolved);
   }
 
@@ -592,20 +594,20 @@
    * [offset] - the offset of the location within [Source].
    * [length] - the length of the location.
    *
-   * Returns the [Location] representing the given offset and length within the
+   * Returns the [LocationImpl] representing the given offset and length within the
    * inner-most [Element].
    */
-  Location _createLocationForOffset(int offset, int length) {
+  LocationImpl _createLocationForOffset(int offset, int length) {
     Element element = peekElement();
-    return new Location(element, offset, length);
+    return new LocationImpl(element, offset, length);
   }
 
   /**
-   * @return the [Location] representing location of the [Token].
+   * @return the [LocationImpl] representing location of the [Token].
    */
-  Location _createLocationForToken(Token token, bool isResolved) {
+  LocationImpl _createLocationForToken(Token token, bool isResolved) {
     Element element = peekElement();
-    return new Location(element, token.offset, token.length,
+    return new LocationImpl(element, token.offset, token.length,
         isQualified: true, isResolved: isResolved);
   }
 
@@ -664,7 +666,7 @@
     ImportElement importElement = internal_getImportElement(
         _libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
-      Location location = _createLocationForOffset(node.offset, 0);
+      LocationImpl location = _createLocationForOffset(node.offset, 0);
       recordRelationship(
           importElement, IndexConstants.IS_REFERENCED_BY, location);
     }
@@ -679,7 +681,7 @@
     if (info != null) {
       int offset = prefixNode.offset;
       int length = info.periodEnd - offset;
-      Location location = _createLocationForOffset(offset, length);
+      LocationImpl location = _createLocationForOffset(offset, length);
       recordRelationship(
           info.element, IndexConstants.IS_REFERENCED_BY, location);
     }
@@ -691,7 +693,7 @@
    */
   void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
     if (library != null) {
-      Location location = _createLocationForNode(node.uri);
+      LocationImpl location = _createLocationForNode(node.uri);
       recordRelationship(library.definingCompilationUnit,
           IndexConstants.IS_REFERENCED_BY, location);
     }
@@ -702,7 +704,7 @@
    */
   void _recordOperatorReference(Token operator, Element element) {
     // prepare location
-    Location location = _createLocationForToken(operator, element != null);
+    LocationImpl location = _createLocationForToken(operator, element != null);
     // record name reference
     {
       String name = operator.lexeme;
@@ -727,7 +729,7 @@
   /**
    * Records a relation between [superNode] and its [Element].
    */
-  void _recordSuperType(TypeName superNode, Relationship relationship) {
+  void _recordSuperType(TypeName superNode, RelationshipImpl relationship) {
     if (superNode != null) {
       Identifier superName = superNode.name;
       if (superName != null) {
@@ -742,19 +744,19 @@
    * Records the [Element] definition in the library and universe.
    */
   void _recordTopLevelElementDefinition(Element element) {
-    Location location = createLocation(element);
+    LocationImpl location = createLocation(element);
     recordRelationship(_libraryElement, IndexConstants.DEFINES, location);
     _store.recordTopLevelDeclaration(element);
   }
 
   /**
-   * Creates a [Location] representing declaration of the [Element].
+   * Creates a [LocationImpl] representing declaration of the [Element].
    */
-  static Location createLocation(Element element) {
+  static LocationImpl createLocation(Element element) {
     if (element != null) {
       int offset = element.nameOffset;
       int length = element.displayName.length;
-      return new Location(element, offset, length);
+      return new LocationImpl(element, offset, length);
     }
     return null;
   }
@@ -765,8 +767,8 @@
    * [location] - the base location
    * [expression] - the expression assigned at the given location
    */
-  static Location _getLocationWithExpressionType(
-      Location location, Expression expression) {
+  static LocationImpl _getLocationWithExpressionType(
+      LocationImpl location, Expression expression) {
     if (expression != null) {
       return new LocationWithData<DartType>(location, expression.bestType);
     }
diff --git a/dart/pkg/analysis_server/lib/src/services/index/index_store.dart b/dart/pkg/analysis_server/lib/src/services/index/index_store.dart
index 7163d16..8dd931a 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/index_store.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/index_store.dart
@@ -15,7 +15,7 @@
  * A container with information computed by an index - relations between
  * elements.
  */
-abstract class IndexStore {
+abstract class InternalIndexStore {
   /**
    * Answers index statistics.
    */
@@ -76,11 +76,11 @@
    *
    * [element] - the the [Element] that has the relationship with the locations
    *    to be returned.
-   * [relationship] - the [Relationship] between the given element and the
+   * [relationship] - the [RelationshipImpl] between the given element and the
    *    locations to be returned
    */
-  Future<List<Location>> getRelationships(
-      Element element, Relationship relationship);
+  Future<List<LocationImpl>> getRelationships(
+      Element element, RelationshipImpl relationship);
 
   /**
    * Returns top-level [Element]s whose names satisfy to [nameFilter].
@@ -107,11 +107,11 @@
    * would be a list containing both `location1` and `location2`.
    *
    * [element] - the [Element] that is related to the location.
-   * [relationship] - the [Relationship] between the element and the location.
-   * [location] the [Location] where relationship happens.
+   * [relationship] - the [RelationshipImpl] between the element and the location.
+   * [location] the [LocationImpl] where relationship happens.
    */
   void recordRelationship(
-      Element element, Relationship relationship, Location location);
+      Element element, RelationshipImpl relationship, LocationImpl location);
 
   /**
    * Records the declaration of the given top-level [element].
diff --git a/dart/pkg/analysis_server/lib/src/services/index/local_index.dart b/dart/pkg/analysis_server/lib/src/services/index/local_index.dart
index e9deeda..a11db6d 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/local_index.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/local_index.dart
@@ -44,15 +44,15 @@
 
   /**
    * Returns a `Future<List<Location>>` that completes with the list of
-   * [Location]s of the given [relationship] with the given [element].
+   * [LocationImpl]s of the given [relationship] with the given [element].
    *
    * For example, if the [element] represents a function and the [relationship]
    * is the `is-invoked-by` relationship, then the locations will be all of the
    * places where the function is invoked.
    */
   @override
-  Future<List<Location>> getRelationships(
-      Element element, Relationship relationship) {
+  Future<List<LocationImpl>> getRelationships(
+      Element element, RelationshipImpl relationship) {
     return _store.getRelationships(element, relationship);
   }
 
diff --git a/dart/pkg/analysis_server/lib/src/services/index/store/codec.dart b/dart/pkg/analysis_server/lib/src/services/index/store/codec.dart
index f9190f0..0c2f816 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/store/codec.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/store/codec.dart
@@ -181,12 +181,12 @@
 
   RelationshipCodec(this._stringCodec);
 
-  Relationship decode(int idIndex) {
+  RelationshipImpl decode(int idIndex) {
     String id = _stringCodec.decode(idIndex);
-    return Relationship.getRelationship(id);
+    return RelationshipImpl.getRelationship(id);
   }
 
-  int encode(Relationship relationship) {
+  int encode(RelationshipImpl relationship) {
     String id = relationship.identifier;
     return _stringCodec.encode(id);
   }
diff --git a/dart/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/dart/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index 6610d8a..bde1d08 100644
--- a/dart/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/dart/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -19,25 +19,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 
-class _TopElementData {
-  final String name;
-  final int elementId1;
-  final int elementId2;
-  final int elementId3;
-
-  factory _TopElementData(ElementCodec elementCodec, Element element) {
-    return new _TopElementData._(element.name, elementCodec.encode1(element),
-        elementCodec.encode2(element), elementCodec.encode3(element));
-  }
-
-  _TopElementData._(
-      this.name, this.elementId1, this.elementId2, this.elementId3);
-
-  Element getElement(AnalysisContext context, ElementCodec elementCodec) {
-    return elementCodec.decode(context, elementId1, elementId2, elementId3);
-  }
-}
-
 /**
  * A manager for files content.
  */
@@ -291,22 +272,23 @@
    *
    * [element] - the the element that has the relationship with the locations to
    *    be returned.
-   * [relationship] - the [Relationship] between the given [element] and the
+   * [relationship] - the [RelationshipImpl] between the given [element] and the
    *    locations to be returned
    */
-  List<Location> getRelationships(Element element, Relationship relationship) {
+  List<LocationImpl> getRelationships(
+      Element element, RelationshipImpl relationship) {
     // prepare key
     RelationKeyData key = new RelationKeyData.forObject(
         _elementCodec, _relationshipCodec, element, relationship);
     // find LocationData(s)
     List<LocationData> locationDatas = _relations[key];
     if (locationDatas == null) {
-      return Location.EMPTY_ARRAY;
+      return LocationImpl.EMPTY_ARRAY;
     }
     // convert to Location(s)
-    List<Location> locations = <Location>[];
+    List<LocationImpl> locations = <LocationImpl>[];
     for (LocationData locationData in locationDatas) {
-      Location location = locationData.getLocation(context, _elementCodec);
+      LocationImpl location = locationData.getLocation(context, _elementCodec);
       if (location != null) {
         locations.add(location);
       }
@@ -339,11 +321,11 @@
    * Records that the given [element] and [location] have the given [relationship].
    *
    * [element] - the [Element] that is related to the location.
-   * [relationship] - the [Relationship] between [element] and [location].
-   * [location] - the [Location] where relationship happens.
+   * [relationship] - the [RelationshipImpl] between [element] and [location].
+   * [location] - the [LocationImpl] where relationship happens.
    */
   void recordRelationship(
-      Element element, Relationship relationship, Location location) {
+      Element element, RelationshipImpl relationship, LocationImpl location) {
     RelationKeyData key = new RelationKeyData.forObject(
         _elementCodec, _relationshipCodec, element, relationship);
     // prepare LocationData(s)
@@ -359,7 +341,7 @@
 
 class InspectLocation {
   final String nodeName;
-  final Relationship relationship;
+  final RelationshipImpl relationship;
   final List<String> path;
   final int offset;
   final int length;
@@ -370,7 +352,7 @@
 }
 
 /**
- * A container with information about a [Location].
+ * A container with information about a [LocationImpl].
  */
 class LocationData {
   static const int _FLAG_QUALIFIED = 1 << 0;
@@ -386,7 +368,7 @@
   LocationData.forData(this.elementId1, this.elementId2, this.elementId3,
       this.offset, this.length, this.flags);
 
-  LocationData.forObject(ElementCodec elementCodec, Location location)
+  LocationData.forObject(ElementCodec elementCodec, LocationImpl location)
       : elementId1 = elementCodec.encode1(location.element),
         elementId2 = elementCodec.encode2(location.element),
         elementId3 = elementCodec.encode3(location.element),
@@ -423,7 +405,7 @@
   /**
    * Returns a {@link Location} that is represented by this {@link LocationData}.
    */
-  Location getLocation(AnalysisContext context, ElementCodec elementCodec) {
+  LocationImpl getLocation(AnalysisContext context, ElementCodec elementCodec) {
     Element element =
         elementCodec.decode(context, elementId1, elementId2, elementId3);
     if (element == null) {
@@ -431,7 +413,7 @@
     }
     bool isQualified = (flags & _FLAG_QUALIFIED) != 0;
     bool isResovled = (flags & _FLAG_RESOLVED) != 0;
-    return new Location(element, offset, length,
+    return new LocationImpl(element, offset, length,
         isQualified: isQualified, isResolved: isResovled);
   }
 }
@@ -487,7 +469,7 @@
 }
 
 /**
- * An [Element] to [Location] relation key.
+ * An [Element] to [LocationImpl] relation key.
  */
 class RelationKeyData {
   final int elementId1;
@@ -500,7 +482,7 @@
 
   RelationKeyData.forObject(ElementCodec elementCodec,
       RelationshipCodec relationshipCodec, Element element,
-      Relationship relationship)
+      RelationshipImpl relationship)
       : elementId1 = elementCodec.encode1(element),
         elementId2 = elementCodec.encode2(element),
         elementId3 = elementCodec.encode3(element),
@@ -517,11 +499,6 @@
   }
 
   @override
-  String toString() {
-    return 'Key($elementId2, $elementId2, $elementId3, $relationshipId)';
-  }
-
-  @override
   bool operator ==(Object obj) {
     if (obj is! RelationKeyData) {
       return false;
@@ -532,12 +509,18 @@
         other.elementId3 == elementId3 &&
         other.relationshipId == relationshipId;
   }
+
+  @override
+  String toString() {
+    return 'Key($elementId2, $elementId2, $elementId3, $relationshipId)';
+  }
 }
 
 /**
- * An [IndexStore] which keeps index information in separate nodes for each unit.
+ * An [InternalIndexStore] which keeps index information in separate nodes for
+ * each unit.
  */
-class SplitIndexStore implements IndexStore {
+class SplitIndexStore implements InternalIndexStore {
   /**
    * The [ContextCodec] to encode/decode [AnalysisContext]s.
    */
@@ -581,8 +564,8 @@
    * A table mapping element names to the node names that may have relations with elements with
    * these names.
    */
-  Map<Relationship, IntToIntSetMap> _relToNameMap =
-      new HashMap<Relationship, IntToIntSetMap>();
+  Map<RelationshipImpl, IntToIntSetMap> _relToNameMap =
+      new HashMap<RelationshipImpl, IntToIntSetMap>();
 
   /**
    * The [NodeManager] to get/put [IndexNode]s.
@@ -728,8 +711,8 @@
     }
   }
 
-  Future<List<Location>> getRelationships(
-      Element element, Relationship relationship) {
+  Future<List<LocationImpl>> getRelationships(
+      Element element, RelationshipImpl relationship) {
     // prepare node names
     List<int> nodeNameIds;
     {
@@ -742,23 +725,26 @@
       }
     }
     // prepare Future(s) for reading each IndexNode
-    List<Future<List<Location>>> nodeFutures = <Future<List<Location>>>[];
+    List<Future<List<LocationImpl>>> nodeFutures =
+        <Future<List<LocationImpl>>>[];
     for (int nodeNameId in nodeNameIds) {
       String nodeName = _stringCodec.decode(nodeNameId);
       Future<IndexNode> nodeFuture = _nodeManager.getNode(nodeName);
-      Future<List<Location>> locationsFuture = nodeFuture.then((node) {
+      Future<List<LocationImpl>> locationsFuture = nodeFuture.then((node) {
         if (node == null) {
           // TODO(scheglov) remove node
-          return Location.EMPTY_ARRAY;
+          return LocationImpl.EMPTY_ARRAY;
         }
         return node.getRelationships(element, relationship);
       });
       nodeFutures.add(locationsFuture);
     }
     // return Future that merges separate IndexNode Location(s)
-    return Future.wait(nodeFutures).then((List<List<Location>> locationsList) {
-      List<Location> allLocations = <Location>[];
-      for (List<Location> locations in locationsList) {
+    return Future
+        .wait(nodeFutures)
+        .then((List<List<LocationImpl>> locationsList) {
+      List<LocationImpl> allLocations = <LocationImpl>[];
+      for (List<LocationImpl> locations in locationsList) {
         allLocations.addAll(locations);
       }
       return allLocations;
@@ -828,7 +814,7 @@
 
   @override
   void recordRelationship(
-      Element element, Relationship relationship, Location location) {
+      Element element, RelationshipImpl relationship, LocationImpl location) {
     if (element == null || element is MultiplyDefinedElement) {
       return;
     }
@@ -944,7 +930,8 @@
     units.add(unit);
   }
 
-  void _recordNodeNameForElement(Element element, Relationship relationship) {
+  void _recordNodeNameForElement(
+      Element element, RelationshipImpl relationship) {
     IntToIntSetMap nameToNodeNames = _relToNameMap[relationship];
     if (nameToNodeNames == null) {
       nameToNodeNames = new IntToIntSetMap();
@@ -1033,3 +1020,22 @@
     _buf[_pos++] = value;
   }
 }
+
+class _TopElementData {
+  final String name;
+  final int elementId1;
+  final int elementId2;
+  final int elementId3;
+
+  factory _TopElementData(ElementCodec elementCodec, Element element) {
+    return new _TopElementData._(element.name, elementCodec.encode1(element),
+        elementCodec.encode2(element), elementCodec.encode3(element));
+  }
+
+  _TopElementData._(
+      this.name, this.elementId1, this.elementId2, this.elementId3);
+
+  Element getElement(AnalysisContext context, ElementCodec elementCodec) {
+    return elementCodec.decode(context, elementId1, elementId2, elementId3);
+  }
+}
diff --git a/dart/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/dart/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 0603b43..2f85e83 100644
--- a/dart/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/dart/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -70,7 +70,7 @@
   CorrectionUtils utils;
   Set<LibraryElement> librariesToImport = new Set<LibraryElement>();
 
-  String returnType;
+  String returnType = '';
   String variableType;
   String name;
   bool extractAll = true;
diff --git a/dart/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/dart/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index e5c80dd..d97cf42 100644
--- a/dart/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/dart/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -6,11 +6,11 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analysis_server/src/services/correction/source_range.dart';
 
 /**
  * A [SearchEngine] implementation.
@@ -197,11 +197,11 @@
 
   _Requestor(this.index);
 
-  void add(Element element, Relationship relationship, MatchKind kind) {
+  void add(Element element, RelationshipImpl relationship, MatchKind kind) {
     Future relationsFuture = index.getRelationships(element, relationship);
-    Future matchesFuture = relationsFuture.then((List<Location> locations) {
+    Future matchesFuture = relationsFuture.then((List<LocationImpl> locations) {
       List<SearchMatch> matches = <SearchMatch>[];
-      for (Location location in locations) {
+      for (LocationImpl location in locations) {
         matches.add(new SearchMatch(kind, location.element,
             new SourceRange(location.offset, location.length),
             location.isResolved, location.isQualified));
diff --git a/dart/pkg/analysis_server/lib/src/socket_server.dart b/dart/pkg/analysis_server/lib/src/socket_server.dart
index 16814af..8fb9b8d 100644
--- a/dart/pkg/analysis_server/lib/src/socket_server.dart
+++ b/dart/pkg/analysis_server/lib/src/socket_server.dart
@@ -13,8 +13,8 @@
 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/plugin.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:plugin/plugin.dart';
 
 /**
  * Instances of the class [SocketServer] implement the common parts of
diff --git a/dart/pkg/analysis_server/lib/src/utilities/change_builder_core.dart b/dart/pkg/analysis_server/lib/src/utilities/change_builder_core.dart
new file mode 100644
index 0000000..9f0225b
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/src/utilities/change_builder_core.dart
@@ -0,0 +1,251 @@
+// 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.utilities.change_builder_core;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/utilities/change_builder_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A builder used to build a [SourceChange].
+ */
+class ChangeBuilderImpl implements ChangeBuilder {
+  /**
+   * The end-of-line marker used in the file being edited, or `null` if the
+   * default marker should be used.
+   */
+  String eol = null;
+
+  /**
+   * The change that is being built.
+   */
+  final SourceChange _change = new SourceChange('');
+
+  /**
+   * A table mapping group ids to the associated linked edit groups.
+   */
+  final Map<String, LinkedEditGroup> _linkedEditGroups =
+      <String, LinkedEditGroup>{};
+
+  /**
+   * Initialize a newly created change builder.
+   */
+  ChangeBuilderImpl();
+
+  @override
+  SourceChange get sourceChange {
+    _linkedEditGroups.forEach((String name, LinkedEditGroup group) {
+      _change.addLinkedEditGroup(group);
+    });
+    _linkedEditGroups.clear();
+    return _change;
+  }
+
+  @override
+  void addFileEdit(Source source, int fileStamp,
+      void buildFileEdit(FileEditBuilder builder)) {
+    FileEditBuilderImpl builder = createFileEditBuilder(source, fileStamp);
+    try {
+      buildFileEdit(builder);
+    } finally {
+      _change.addFileEdit(builder.fileEdit);
+    }
+  }
+
+  /**
+   * Create and return a [FileEditBuilder] that can be used to build edits to
+   * the given [source].
+   */
+  FileEditBuilderImpl createFileEditBuilder(Source source, int fileStamp) {
+    return new FileEditBuilderImpl(this, source, fileStamp);
+  }
+
+  /**
+   * Return the linked edit group with the given [groupName], creating it if it
+   * did not already exist.
+   */
+  LinkedEditGroup getLinkedEditGroup(String groupName) {
+    LinkedEditGroup group = _linkedEditGroups[groupName];
+    if (group == null) {
+      group = new LinkedEditGroup.empty();
+      _linkedEditGroups[groupName] = group;
+    }
+    return group;
+  }
+}
+
+/**
+ * A builder used to build a [SourceEdit] as part of a [SourceFileEdit].
+ */
+class EditBuilderImpl implements EditBuilder {
+  /**
+   * The builder being used to create the source file edit of which the source
+   * edit will be a part.
+   */
+  final FileEditBuilderImpl fileEditBuilder;
+
+  /**
+   * The offset of the region being replaced.
+   */
+  final int offset;
+
+  /**
+   * The length of the region being replaced.
+   */
+  final int length;
+
+  /**
+   * The end-of-line marker used in the file being edited, or `null` if the
+   * default marker should be used.
+   */
+  String _eol = null;
+
+  /**
+   * The buffer in which the content of the edit is being composed.
+   */
+  final StringBuffer _buffer = new StringBuffer();
+
+  /**
+   * Initialize a newly created builder to build a source edit.
+   */
+  EditBuilderImpl(this.fileEditBuilder, this.offset, this.length) {
+    _eol = fileEditBuilder.changeBuilder.eol;
+  }
+
+  /**
+   * Create and return an edit representing the replacement of a region of the
+   * file with the accumulated text.
+   */
+  SourceEdit get sourceEdit =>
+      new SourceEdit(offset, length, _buffer.toString());
+
+  @override
+  void addLinkedEdit(
+      String groupName, void buildLinkedEdit(LinkedEditBuilder builder)) {
+    LinkedEditBuilderImpl builder = createLinkedEditBuilder();
+    int start = offset + _buffer.length;
+    try {
+      buildLinkedEdit(builder);
+    } finally {
+      int end = offset + _buffer.length;
+      int length = end - start;
+      Position position = new Position(fileEditBuilder.fileEdit.file, start);
+      LinkedEditGroup group =
+          fileEditBuilder.changeBuilder.getLinkedEditGroup(groupName);
+      group.addPosition(position, length);
+      for (LinkedEditSuggestion suggestion in builder.suggestions) {
+        group.addSuggestion(suggestion);
+      }
+    }
+  }
+
+  LinkedEditBuilderImpl createLinkedEditBuilder() {
+    return new LinkedEditBuilderImpl(this);
+  }
+
+  @override
+  void write(String string) {
+    _buffer.write(string);
+  }
+
+  @override
+  void writeln([String string]) {
+    if (string != null) {
+      _buffer.write(string);
+    }
+    if (_eol == null) {
+      _buffer.writeln();
+    } else {
+      _buffer.write(_eol);
+    }
+  }
+}
+
+/**
+ * A builder used to build a [SourceFileEdit] within a [SourceChange].
+ */
+class FileEditBuilderImpl implements FileEditBuilder {
+  /**
+   * The builder being used to create the source change of which the source file
+   * edit will be a part.
+   */
+  final ChangeBuilderImpl changeBuilder;
+
+  /**
+   * The source file edit that is being built.
+   */
+  final SourceFileEdit fileEdit;
+
+  /**
+   * Initialize a newly created builder to build a source file edit within the
+   * change being built by the given [changeBuilder]. The file being edited has
+   * the given [timeStamp] and [timeStamp].
+   */
+  FileEditBuilderImpl(this.changeBuilder, Source source, int timeStamp)
+      : fileEdit = new SourceFileEdit(source.fullName, timeStamp);
+
+  @override
+  void addInsertion(int offset, void buildEdit(EditBuilder builder)) {
+    EditBuilderImpl builder = createEditBuilder(offset, 0);
+    try {
+      buildEdit(builder);
+    } finally {
+      fileEdit.add(builder.sourceEdit);
+    }
+  }
+
+  @override
+  void addLinkedPosition(int offset, int length, String groupName) {
+    LinkedEditGroup group = changeBuilder.getLinkedEditGroup(groupName);
+    Position position = new Position(fileEdit.file, offset);
+    group.addPosition(position, length);
+  }
+
+  @override
+  void addReplacement(
+      int offset, int length, void buildEdit(EditBuilder builder)) {
+    EditBuilderImpl builder = createEditBuilder(offset, length);
+    try {
+      buildEdit(builder);
+    } finally {
+      fileEdit.add(builder.sourceEdit);
+    }
+  }
+
+  EditBuilderImpl createEditBuilder(int offset, int length) {
+    return new EditBuilderImpl(this, offset, length);
+  }
+}
+
+/**
+ * A builder used to build a [LinkedEdit] region within an edit.
+ */
+class LinkedEditBuilderImpl implements LinkedEditBuilder {
+  final EditBuilderImpl editBuilder;
+
+  final List<LinkedEditSuggestion> suggestions = <LinkedEditSuggestion>[];
+
+  LinkedEditBuilderImpl(this.editBuilder);
+
+  @override
+  void addSuggestion(LinkedEditSuggestionKind kind, String value) {
+    suggestions.add(new LinkedEditSuggestion(value, kind));
+  }
+
+  @override
+  void addSuggestions(LinkedEditSuggestionKind kind, List<String> values) {
+    values.forEach((value) => addSuggestion(kind, value));
+  }
+
+  @override
+  void write(String string) {
+    editBuilder.write(string);
+  }
+
+  @override
+  void writeln([String string]) {
+    editBuilder.writeln(string);
+  }
+}
diff --git a/dart/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart b/dart/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart
new file mode 100644
index 0000000..e6b1de9
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart
@@ -0,0 +1,471 @@
+// 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.utilities.change_builder_dart;
+
+import 'package:analysis_server/src/protocol.dart' hide ElementKind;
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/utilities/change_builder_core.dart';
+import 'package:analysis_server/utilities/change_builder_core.dart';
+import 'package:analysis_server/utilities/change_builder_dart.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+
+/**
+ * A [ChangeBuilder] used to build changes in Dart files.
+ */
+class DartChangeBuilderImpl extends ChangeBuilderImpl
+    implements DartChangeBuilder {
+  /**
+   * The analysis context in which the files being edited were analyzed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * Initialize a newly created change builder.
+   */
+  DartChangeBuilderImpl(this.context);
+
+  @override
+  DartFileEditBuilderImpl createFileEditBuilder(Source source, int fileStamp) {
+    return new DartFileEditBuilderImpl(this, source, fileStamp);
+  }
+}
+
+/**
+ * An [EditBuilder] used to build edits in Dart files.
+ */
+class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder {
+  /**
+   * A utility class used to help build the source code.
+   */
+  final CorrectionUtils utils;
+
+  /**
+   * Initialize a newly created builder to build a source edit.
+   */
+  DartEditBuilderImpl(
+      DartFileEditBuilderImpl sourceFileEditBuilder, int offset, int length)
+      : utils = sourceFileEditBuilder.utils,
+        super(sourceFileEditBuilder, offset, length);
+
+  DartFileEditBuilderImpl get dartFileEditBuilder => fileEditBuilder;
+
+  @override
+  void writeClassDeclaration(String name, {Iterable<DartType> interfaces,
+      bool isAbstract: false, void memberWriter(), Iterable<DartType> mixins,
+      String nameGroupName, DartType superclass}) {
+    // TODO(brianwilkerson) Add support for type parameters, probably as a
+    // parameterWriter parameter.
+    // TODO(brianwilkerson) Add a superclassGroupName parameter.
+    if (isAbstract) {
+      write(Keyword.ABSTRACT.syntax);
+      write(' ');
+    }
+    write('class ');
+    if (nameGroupName == null) {
+      write(name);
+    } else {
+      addLinkedEdit(DartEditBuilder.NAME_GROUP_ID, (LinkedEditBuilder builder) {
+        write(name);
+      });
+    }
+    if (superclass != null) {
+      write(' extends ');
+      writeType(superclass, groupName: DartEditBuilder.SUPERCLASS_GROUP_ID);
+    } else if (mixins != null && mixins.isNotEmpty) {
+      write(' extends Object ');
+    }
+    writeTypes(mixins, prefix: ' with ');
+    writeTypes(interfaces, prefix: ' implements ');
+    writeln(' {');
+    if (memberWriter != null) {
+      writeln();
+      memberWriter();
+      writeln();
+    }
+    write('}');
+  }
+
+  //@override
+  void writeConstructorDeclaration(ClassElement classElement,
+      {ArgumentList argumentList, SimpleIdentifier constructorName,
+      bool isConst: false}) {
+    // TODO(brianwilkerson) Clean up the API and add it to the public API.
+    //
+    // TODO(brianwilkerson) Support passing a list of final fields rather than
+    // an argument list.
+    if (isConst) {
+      write(Keyword.CONST.syntax);
+      write(' ');
+    }
+    write(classElement.name);
+    write('.');
+    if (constructorName != null) {
+      addLinkedEdit(DartEditBuilder.NAME_GROUP_ID, (LinkedEditBuilder builder) {
+        write(constructorName.name);
+      });
+      CompilationUnit unit = constructorName
+          .getAncestor((AstNode node) => node is CompilationUnit);
+      if (unit != null) {
+        CompilationUnitElement element = unit.element;
+        if (element != null) {
+          String referenceFile = element.source.fullName;
+          if (referenceFile == dartFileEditBuilder.fileEdit.file) {
+            dartFileEditBuilder.addLinkedPosition(constructorName.offset,
+                constructorName.length, DartEditBuilder.NAME_GROUP_ID);
+          }
+        }
+      }
+    }
+    if (argumentList != null) {
+      writeParametersMatchingArguments(argumentList);
+    } else {
+      write('()');
+    }
+    writeln(' {');
+    write('  }');
+  }
+
+  @override
+  void writeFieldDeclaration(String name, {void initializerWriter(),
+      bool isConst: false, bool isFinal: false, bool isStatic: false,
+      String nameGroupName, DartType type, String typeGroupName}) {
+    if (isStatic) {
+      write(Keyword.STATIC.syntax);
+      write(' ');
+    }
+    bool typeRequired = true;
+    if (isConst) {
+      write(Keyword.CONST.syntax);
+      typeRequired = false;
+    } else if (isFinal) {
+      write(Keyword.FINAL.syntax);
+      typeRequired = false;
+    }
+    if (type != null) {
+      writeType(type, groupName: typeGroupName);
+    } else if (typeRequired) {
+      write(Keyword.VAR.syntax);
+    }
+    write(' ');
+    if (nameGroupName != null) {
+      addLinkedEdit(nameGroupName, (LinkedEditBuilder builder) {
+        write(name);
+      });
+    } else {
+      write(name);
+    }
+    if (initializerWriter != null) {
+      write(' = ');
+      initializerWriter();
+    }
+    write(';');
+  }
+
+  @override
+  void writeGetterDeclaration(String name, {void bodyWriter(),
+      bool isStatic: false, String nameGroupName, DartType returnType,
+      String returnTypeGroupName}) {
+    if (isStatic) {
+      write(Keyword.STATIC.syntax);
+      write(' ');
+    }
+    if (returnType != null) {
+      writeType(returnType, groupName: returnTypeGroupName);
+      write(' ');
+    }
+    write(Keyword.GET.syntax);
+    write(' ');
+    if (nameGroupName != null) {
+      addLinkedEdit(nameGroupName, (LinkedEditBuilder builder) {
+        write(name);
+      });
+    } else {
+      write(name);
+    }
+    if (bodyWriter == null) {
+      write(' => null;');
+    } else {
+      write(' ');
+      bodyWriter();
+    }
+  }
+
+  @override
+  void writeOverrideOfInheritedMember(ExecutableElement member) {
+    // prepare environment
+    String prefix = utils.getIndent(1);
+    // may be property
+    String prefix2 = utils.getIndent(2);
+    ElementKind elementKind = member.kind;
+    bool isGetter = elementKind == ElementKind.GETTER;
+    bool isSetter = elementKind == ElementKind.SETTER;
+    bool isMethod = elementKind == ElementKind.METHOD;
+    bool isOperator = isMethod && (member as MethodElement).isOperator;
+    write(prefix);
+    if (isGetter) {
+      writeln('// TODO: implement ${member.displayName}');
+      write(prefix);
+    }
+    // @override
+    writeln('@override');
+    write(prefix);
+    // return type
+    // REVIEW: Added groupId
+    bool shouldReturn = writeType(member.type.returnType,
+        groupName: DartEditBuilder.RETURN_TYPE_GROUP_ID);
+    write(' ');
+    if (isGetter) {
+      write(Keyword.GET.syntax);
+      write(' ');
+    } else if (isSetter) {
+      write(Keyword.SET.syntax);
+      write(' ');
+    } else if (isOperator) {
+      write(Keyword.OPERATOR.syntax);
+      write(' ');
+    }
+    // name
+    write(member.displayName);
+    // parameters + body
+    if (isGetter) {
+      writeln(' => null;');
+    } else {
+      List<ParameterElement> parameters = member.parameters;
+      writeParameters(parameters);
+      writeln(' {');
+      // TO-DO
+      write(prefix2);
+      writeln('// TODO: implement ${member.displayName}');
+      // REVIEW: Added return statement.
+      if (shouldReturn) {
+        write(prefix2);
+        writeln('return null;');
+      }
+      // close method
+      write(prefix);
+      writeln('}');
+    }
+  }
+
+  @override
+  void writeParameters(Iterable<ParameterElement> parameters) {
+    write('(');
+    bool sawNamed = false;
+    bool sawPositional = false;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameter = parameters.elementAt(i);
+      if (i > 0) {
+        write(', ');
+      }
+      // may be optional
+      ParameterKind parameterKind = parameter.parameterKind;
+      if (parameterKind == ParameterKind.NAMED) {
+        if (!sawNamed) {
+          write('{');
+          sawNamed = true;
+        }
+      }
+      if (parameterKind == ParameterKind.POSITIONAL) {
+        if (!sawPositional) {
+          write('[');
+          sawPositional = true;
+        }
+      }
+      // parameter
+      writeParameterSource(parameter.type, parameter.name);
+      // default value
+      String defaultCode = parameter.defaultValueCode;
+      if (defaultCode != null) {
+        if (sawPositional) {
+          write(' = ');
+        } else {
+          write(': ');
+        }
+        write(defaultCode);
+      }
+    }
+    // close parameters
+    if (sawNamed) {
+      write('}');
+    }
+    if (sawPositional) {
+      write(']');
+    }
+    write(')');
+  }
+
+  @override
+  void writeParametersMatchingArguments(ArgumentList arguments) {
+    Set<String> excluded = new Set();
+    bool namedFound = false;
+    write('(');
+    List<Expression> argumentList = arguments.arguments;
+    for (int i = 0; i < argumentList.length; i++) {
+      Expression argument = argumentList[i];
+      DartType type = argument.bestType;
+      List<String> suggestions =
+          _getParameterNameSuggestions(excluded, type, argument, i);
+      String favorite = suggestions[0];
+      // append separator
+      if (i > 0) {
+        write(', ');
+      }
+      if (argument is NamedExpression) {
+        if (!namedFound) {
+          namedFound = true;
+          write('[');
+        }
+        favorite = argument.name.label.name;
+      }
+      // append type name
+      writeType(type, addSupertypeProposals: true, groupName: 'TYPE$i');
+      write(' ');
+      // append parameter name
+      excluded.add(favorite);
+      addLinkedEdit('ARG$i', (LinkedEditBuilder builder) {
+        builder.write(favorite);
+        builder.addSuggestions(LinkedEditSuggestionKind.PARAMETER, suggestions);
+      });
+    }
+    if (namedFound) {
+      write(']');
+    }
+    write(')');
+  }
+
+  @override
+  void writeParameterSource(DartType type, String name) {
+    String parameterSource = utils.getParameterSource(
+        type, name, dartFileEditBuilder.librariesToImport);
+    write(parameterSource);
+  }
+
+  @override
+  bool writeType(DartType type, {bool addSupertypeProposals: false,
+      String groupName, bool required: false}) {
+    if (type != null && !type.isDynamic) {
+      String typeSource =
+          utils.getTypeSource(type, dartFileEditBuilder.librariesToImport);
+      if (groupName != null) {
+        addLinkedEdit(groupName, (LinkedEditBuilder builder) {
+          write(typeSource);
+          if (addSupertypeProposals) {
+            _addSuperTypeProposals(builder, type, new Set<DartType>());
+          }
+        });
+      } else {
+        write(typeSource);
+      }
+      return true;
+    } else if (required) {
+      write(Keyword.VAR.syntax);
+    }
+    return false;
+  }
+
+  /**
+   * Write the code for a comma-separated list of [types], optionally prefixed
+   * by a [prefix]. If the list of [types] is `null` or does not return any
+   * types, then nothing will be written.
+   */
+  void writeTypes(Iterable<DartType> types, {String prefix}) {
+    if (types == null || types.isEmpty) {
+      return;
+    }
+    bool first = true;
+    for (DartType type in types) {
+      if (first) {
+        if (prefix != null) {
+          write(prefix);
+        }
+        first = false;
+      } else {
+        write(', ');
+      }
+      writeType(type);
+    }
+  }
+
+  void _addSuperTypeProposals(
+      LinkedEditBuilder builder, DartType type, Set<DartType> alreadyAdded) {
+    if (type != null &&
+        type.element is ClassElement &&
+        alreadyAdded.add(type)) {
+      ClassElement element = type.element as ClassElement;
+      builder.addSuggestion(LinkedEditSuggestionKind.TYPE, element.name);
+      _addSuperTypeProposals(builder, element.supertype, alreadyAdded);
+      for (InterfaceType interfaceType in element.interfaces) {
+        _addSuperTypeProposals(builder, interfaceType, alreadyAdded);
+      }
+    }
+  }
+
+  /**
+   * Return a list containing the suggested names for a parmeter with the given
+   * [type] whose value in one location is computed by the given [expression].
+   * The list will not contain any names in the set of [excluded] names. The
+   * [index] is the index of the argument, used to create a name if no better
+   * name could be created. The first name in the list will be the best name.
+   */
+  List<String> _getParameterNameSuggestions(
+      Set<String> excluded, DartType type, Expression expression, int index) {
+    List<String> suggestions =
+        getVariableNameSuggestionsForExpression(type, expression, excluded);
+    if (suggestions.length != 0) {
+      return suggestions;
+    }
+    return <String>['arg$index'];
+  }
+}
+
+/**
+ * A [FileEditBuilder] used to build edits for Dart files.
+ */
+class DartFileEditBuilderImpl extends FileEditBuilderImpl
+    implements DartFileEditBuilder {
+  /**
+   * The compilation unit to which the code will be added.
+   */
+  CompilationUnit unit;
+
+  /**
+   * A utility class used to help build the source code.
+   */
+  CorrectionUtils utils;
+
+  /**
+   * A set containing the elements of the libraries that need to be imported in
+   * order to make visible the names used in generated code.
+   */
+  Set<LibraryElement> librariesToImport = new Set<LibraryElement>();
+
+  /**
+   * Initialize a newly created builder to build a source file edit within the
+   * change being built by the given [changeBuilder]. The file being edited has
+   * the given [source] and [timeStamp].
+   */
+  DartFileEditBuilderImpl(
+      DartChangeBuilderImpl changeBuilder, Source source, int timeStamp)
+      : super(changeBuilder, source, timeStamp) {
+    AnalysisContext context = changeBuilder.context;
+    List<Source> librariesContaining = context.getLibrariesContaining(source);
+    if (librariesContaining.length < 1) {
+      throw new StateError('Cannot build edits for ${source.fullName}');
+    }
+    unit = context.resolveCompilationUnit2(source, librariesContaining[0]);
+    utils = new CorrectionUtils(unit);
+  }
+
+  @override
+  DartEditBuilderImpl createEditBuilder(int offset, int length) {
+    return new DartEditBuilderImpl(this, offset, length);
+  }
+}
diff --git a/dart/pkg/analysis_server/lib/starter.dart b/dart/pkg/analysis_server/lib/starter.dart
index 8d5658a..dae6a05 100644
--- a/dart/pkg/analysis_server/lib/starter.dart
+++ b/dart/pkg/analysis_server/lib/starter.dart
@@ -6,7 +6,7 @@
 
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/plugin.dart';
+import 'package:plugin/plugin.dart';
 
 /**
  * An object that can be used to start an analysis server.
diff --git a/dart/pkg/analysis_server/lib/utilities/change_builder_core.dart b/dart/pkg/analysis_server/lib/utilities/change_builder_core.dart
new file mode 100644
index 0000000..7c69c46
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/utilities/change_builder_core.dart
@@ -0,0 +1,123 @@
+// 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.utilities.change_builder_core;
+
+import 'package:analysis_server/src/utilities/change_builder_core.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A builder used to build a [SourceChange].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ChangeBuilder {
+  /**
+   * Initialize a newly created change builder.
+   */
+  factory ChangeBuilder() = ChangeBuilderImpl;
+
+  /**
+   * Return the source change that was built.
+   */
+  SourceChange get sourceChange;
+
+  /**
+   * Use the [buildFileEdit] function to create a collection of edits to the
+   * given [source]. The edits will be added to the source change that is being
+   * built. The [timeStamp] is the time at which the [source] was last modified
+   * and is used by clients to ensure that it is safe to apply the edits.
+   */
+  void addFileEdit(Source source, int timeStamp,
+      void buildFileEdit(FileEditBuilder builder));
+}
+
+/**
+ * A builder used to build a [SourceEdit] as part of a [SourceFileEdit].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class EditBuilder {
+  /**
+   * Add a region of text that is part of the linked edit group with the given
+   * [groupName]. The [buildLinkedEdit] function is used to write the content of
+   * the region of text and to add suggestions for other possible values for
+   * that region.
+   */
+  void addLinkedEdit(
+      String groupName, void buildLinkedEdit(LinkedEditBuilder builder));
+
+  /**
+   * Add the given [string] to the content of the current edit.
+   */
+  void write(String string);
+
+  /**
+   * Add the given [string] to the content of the current edit and then add an
+   * end-of-line marker.
+   */
+  void writeln([String string]);
+}
+
+/**
+ * A builder used to build a [SourceFileEdit] within a [SourceChange].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class FileEditBuilder {
+  /**
+   * Add an insertion of text at the given [offset]. The [offset] is relative to
+   * the original source. The [buildEdit] function is used to write the text to
+   * be inserted. This is fully equivalent to
+   *
+   *     addReplacement(offset, 0, buildEdit);
+   */
+  void addInsertion(int offset, void buildEdit(EditBuilder builder));
+
+  /**
+   * Add the region of text starting at the given [offset] and continuing for
+   * the given [length] to the linked edit group with the given [groupName].
+   * The [offset] is relative to the original source. This is typically used to
+   * include pre-existing regions of text in a group.
+   */
+  void addLinkedPosition(int offset, int length, String groupName);
+
+  /**
+   * Add a replacement of text starting at the given [offset] and continuing for
+   * the given [length]. The [offset] is relative to the original source. The
+   * [buildEdit] function is used to write the text that will replace the
+   * specified region.
+   */
+  void addReplacement(
+      int offset, int length, void buildEdit(EditBuilder builder));
+}
+
+/**
+ * A builder used to build a [LinkedEdit] region within an edit.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class LinkedEditBuilder {
+  /**
+   * Add the given [value] as a suggestion with the given [kind].
+   */
+  void addSuggestion(LinkedEditSuggestionKind kind, String value);
+
+  /**
+   * Add each of the given [values] as a suggestion with the given [kind].
+   */
+  void addSuggestions(LinkedEditSuggestionKind kind, Iterable<String> values);
+
+  /**
+   * Add the given [string] to the content of the current edit.
+   */
+  void write(String string);
+
+  /**
+   * Add the given [string] to the content of the current edit and then add an
+   * end-of-line marker.
+   */
+  void writeln([String string]);
+}
diff --git a/dart/pkg/analysis_server/lib/utilities/change_builder_dart.dart b/dart/pkg/analysis_server/lib/utilities/change_builder_dart.dart
new file mode 100644
index 0000000..b81b22a
--- /dev/null
+++ b/dart/pkg/analysis_server/lib/utilities/change_builder_dart.dart
@@ -0,0 +1,142 @@
+// 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.utilities.change_builder_dart;
+
+import 'package:analysis_server/src/utilities/change_builder_dart.dart';
+import 'package:analysis_server/utilities/change_builder_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+/**
+ * A [ChangeBuilder] used to build changes in Dart files.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class DartChangeBuilder extends ChangeBuilder {
+  /**
+   * Initialize a newly created change builder.
+   */
+  factory DartChangeBuilder(AnalysisContext context) = DartChangeBuilderImpl;
+}
+
+/**
+ * An [EditBuilder] used to build edits in Dart files.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class DartEditBuilder extends EditBuilder {
+  /**
+   * The group-id used for the name of a declaration.
+   */
+  static const String NAME_GROUP_ID = 'NAME';
+
+  /**
+   * The group-id used for the return type of a function, getter or method.
+   */
+  static const String RETURN_TYPE_GROUP_ID = 'RETURN_TYPE';
+
+  /**
+   * The group-id used for the name of the superclass in a class declaration.
+   */
+  static const String SUPERCLASS_GROUP_ID = 'SUPERCLASS';
+
+  /**
+   * Write the code for a declaration of a class with the given [name]. If a
+   * list of [interfaces] is provided, then the class will implement those
+   * interfaces. If [isAbstract] is `true`, then the class will be abstract. If
+   * a [memberWriter] is provided, then it will be invoked to allow members to
+   * be generated. (The members will automatically be preceeded and followed by
+   * end-of-line markers.) If a list of [mixins] is provided, then the class
+   * will mix in those classes. If a [nameGroupName] is provided, then the name
+   * of the class will be included in the linked edit group with that name. If a
+   * [superclass] is given then it will be the superclass of the class. (If a
+   * list of [mixins] is provided but no [superclass] is given then the class
+   * will extend `Object`.)
+   */
+  void writeClassDeclaration(String name, {Iterable<DartType> interfaces,
+      bool isAbstract: false, void memberWriter(), Iterable<DartType> mixins,
+      String nameGroupName, DartType superclass});
+
+  /**
+   * Write the code for a declaration of a field with the given [name]. If an
+   * [initializerWriter] is provided, it will be invoked to write the content of
+   * the initializer. (The equal sign separating the field name from the
+   * initializer expression will automatically be written.) If [isConst] is
+   * `true`, then the declaration will be preceeded by the `const` keyword. If
+   * [isFinal] is `true`, then the declaration will be preceeded by the `final`
+   * keyword. (If both [isConst] and [isFinal] are `true`, then only the `const`
+   * keyword will be written.) If [isStatic] is `true`, then the declaration
+   * will be preceeded by the `static` keyword. If a [nameGroupName] is
+   * provided, the name of the field will be included in the linked edit group
+   * with that name. If a [type] is provided, then it will be used as the type
+   * of the field. (The keyword `var` will be provided automatically when
+   * required.) If a [typeGroupName] is provided, then if a type was written
+   * it will be in the linked edit group with that name.
+   */
+  void writeFieldDeclaration(String name, {void initializerWriter(),
+      bool isConst: false, bool isFinal: false, bool isStatic: false,
+      String nameGroupName, DartType type, String typeGroupName});
+
+  /**
+   * Write the code for a declaration of a getter with the given [name]. If a
+   * [bodyWriter] is provided, it will be invoked to write the body of the
+   * getter. (The space between the name and the body will automatically be
+   * written.) If [isStatic] is `true`, then the declaration will be preceeded
+   * by the `static` keyword. If a [nameGroupName] is provided, the name of the
+   * getter will be included in the linked edit group with that name. If a
+   * [returnType] is provided, then it will be used as the return type of the
+   * getter. If a [returnTypeGroupName] is provided, then if a return type was
+   * written it will be in the linked edit group with that name.
+   */
+  void writeGetterDeclaration(String name, {void bodyWriter(),
+      bool isStatic: false, String nameGroupName, DartType returnType,
+      String returnTypeGroupName});
+
+  /**
+   * Append a placeholder for an override of the specified inherited [member].
+   */
+  void writeOverrideOfInheritedMember(ExecutableElement member);
+
+  /**
+   * Write the code for a list of [parameters], including the surrounding
+   * parentheses.
+   */
+  void writeParameters(Iterable<ParameterElement> parameters);
+
+  /**
+   * Write the code for a list of parameters that would match the given list of
+   * [arguments], including the surrounding parentheses.
+   */
+  void writeParametersMatchingArguments(ArgumentList arguments);
+
+  /**
+   * Write the code for a single parameter with the given [type] and [name].
+   * The [type] can be `null` if no type is to be specified for the parameter.
+   */
+  void writeParameterSource(DartType type, String name);
+
+  /**
+   * Write the code for a type annotation for the given [type]. If the [type] is
+   * either `null` or represents the type 'dynamic', then the behavior depends
+   * on whether a type is [required]. If [required] is `true`, then 'var' will
+   * be written; otherwise, nothing is written.
+   *
+   * If the [groupName] is not `null`, then the name of the type (including type
+   * parameters) will be included as a region in the linked edit group with that
+   * name. If the [groupName] is not `null` and [addSupertypeProposals] is
+   * `true`, then all of the supertypes of the [type] will be added as
+   * suggestions for alternatives to the type name.
+   */
+  bool writeType(DartType type, {bool addSupertypeProposals: false,
+      String groupName, bool required: false});
+}
+
+/**
+ * A [FileEditBuilder] used to build edits for Dart files.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class DartFileEditBuilder extends FileEditBuilder {}
diff --git a/dart/pkg/analysis_server/pubspec.yaml b/dart/pkg/analysis_server/pubspec.yaml
index 927bdee..52f3479 100644
--- a/dart/pkg/analysis_server/pubspec.yaml
+++ b/dart/pkg/analysis_server/pubspec.yaml
@@ -4,17 +4,19 @@
 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.0.0 <2.0.0'
+  sdk: '>=1.9.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.24.1-alpha.0 <0.25.0'
-  args: '>=0.12.1 <0.13.0'
+  analyzer: '>=0.25.0 <0.26.0'
+  args: '>=0.13.0 <0.14.0'
   dart_style: '>=0.1.7 <0.2.0'
   logging: any
   path: any
+  plugin: '<0.2.0'
   watcher: any
   yaml: any
 dev_dependencies:
-  html5lib: any
+  html: any
   mock: '>=0.11.0 <0.12.0'
+  test_reflective_loader: '>=0.0.3 <0.1.0'
   typed_mock: '>=0.0.4 <1.0.0'
   unittest: '>=0.11.4 <0.12.0'
diff --git a/dart/pkg/analysis_server/test/abstract_context.dart b/dart/pkg/analysis_server/test/abstract_context.dart
index bb9a85a..696a2ae 100644
--- a/dart/pkg/analysis_server/test/abstract_context.dart
+++ b/dart/pkg/analysis_server/test/abstract_context.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -41,9 +42,16 @@
   static final UriResolver SDK_RESOLVER = new DartUriResolver(SDK);
 
   MemoryResourceProvider provider = new MemoryResourceProvider();
+  Map<String, List<Folder>> packageMap;
   UriResolver resourceResolver;
   AnalysisContext context;
 
+  Source addPackageSource(String packageName, String filePath, String content) {
+    packageMap[packageName] = [(provider.newFolder('/pubcache/$packageName'))];
+    File file = provider.newFile('/pubcache/$packageName/$filePath', content);
+    return file.createSource();
+  }
+
   Source addSource(String path, String content, [Uri uri]) {
     File file = provider.newFile(path, content);
     Source source = file.createSource(uri);
@@ -76,8 +84,12 @@
 
   void setUp() {
     resourceResolver = new ResourceUriResolver(provider);
+    packageMap = new Map<String, List<Folder>>();
+    PackageMapUriResolver packageResolver =
+        new PackageMapUriResolver(provider, packageMap);
     context = AnalysisEngine.instance.createAnalysisContext();
-    context.sourceFactory = new SourceFactory([SDK_RESOLVER, resourceResolver]);
+    context.sourceFactory =
+        new SourceFactory([SDK_RESOLVER, packageResolver, resourceResolver]);
   }
 
   void tearDown() {
diff --git a/dart/pkg/analysis_server/test/analysis/get_errors_test.dart b/dart/pkg/analysis_server/test/analysis/get_errors_test.dart
index 44e1fc5..846990d 100644
--- a/dart/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -9,14 +9,14 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(GetErrorsTest);
+  defineReflectiveTests(GetErrorsTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/get_hover_test.dart b/dart/pkg/analysis_server/test/analysis/get_hover_test.dart
index 6428832..7261b3c 100644
--- a/dart/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -7,14 +7,14 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisHoverTest);
+  defineReflectiveTests(AnalysisHoverTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_errors_test.dart b/dart/pkg/analysis_server/test/analysis/notification_errors_test.dart
index d0195fd..3375ba4 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -7,14 +7,14 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(NotificationErrorsTest);
+  defineReflectiveTests(NotificationErrorsTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/dart/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index e1bc205..5e08e7b 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -8,14 +8,14 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
-  runReflectiveTests(AnalysisNotificationHighlightsTest);
-  runReflectiveTests(HighlightTypeTest);
+  defineReflectiveTests(AnalysisNotificationHighlightsTest);
+  defineReflectiveTests(HighlightTypeTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/dart/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 8c6dab0..cc24ca3 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -8,14 +8,14 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisNotificationNavigationTest);
+  defineReflectiveTests(AnalysisNotificationNavigationTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_occurrences_test.dart b/dart/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
index 2b78fbf..d7f8779 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
@@ -8,14 +8,14 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisNotificationOccurrencesTest);
+  defineReflectiveTests(AnalysisNotificationOccurrencesTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_outline_test.dart b/dart/pkg/analysis_server/test/analysis/notification_outline_test.dart
index cae3f7b..6311762 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -8,13 +8,13 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
-  runReflectiveTests(_AnalysisNotificationOutlineTest);
+  defineReflectiveTests(_AnalysisNotificationOutlineTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/notification_overrides_test.dart b/dart/pkg/analysis_server/test/analysis/notification_overrides_test.dart
index 17a1e49..cf272a0 100644
--- a/dart/pkg/analysis_server/test/analysis/notification_overrides_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -8,14 +8,14 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisNotificationOverridesTest);
+  defineReflectiveTests(AnalysisNotificationOverridesTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/reanalyze_test.dart b/dart/pkg/analysis_server/test/analysis/reanalyze_test.dart
index 2e85d6d..0884fdb 100644
--- a/dart/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -7,14 +7,14 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ReanalyzeTest);
+  defineReflectiveTests(ReanalyzeTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/analysis/update_content_test.dart b/dart/pkg/analysis_server/test/analysis/update_content_test.dart
index 226b6c1..e137ab9 100644
--- a/dart/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/dart/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -11,15 +11,15 @@
 import 'package:analyzer/src/generated/ast.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:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(UpdateContentTest);
+  defineReflectiveTests(UpdateContentTest);
 }
 
 compilationUnitMatcher(String file) {
diff --git a/dart/pkg/analysis_server/test/analysis_server_test.dart b/dart/pkg/analysis_server/test/analysis_server_test.dart
index 374f47b..eb6387d 100644
--- a/dart/pkg/analysis_server/test/analysis_server_test.dart
+++ b/dart/pkg/analysis_server/test/analysis_server_test.dart
@@ -18,16 +18,16 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mock_sdk.dart';
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisServerTest);
+  defineReflectiveTests(AnalysisServerTest);
 }
 
 @reflectiveTest
@@ -243,6 +243,20 @@
     expect(source.fullName, filePath);
   }
 
+  test_getContextSourcePair_nonFile() {
+    String dirPath = '/dir';
+    Folder dir = resourceProvider.newFolder(dirPath);
+
+    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
+    _configureSourceFactory(context);
+    server.folderMap[dir] = context;
+
+    ContextSourcePair pair = server.getContextSourcePair(dirPath);
+    expect(pair, isNotNull);
+    expect(pair.context, isNull);
+    expect(pair.source, isNull);
+  }
+
   test_getContextSourcePair_package_inRoot() {
     String rootPath = '/my_package';
     String filePath = rootPath + '/lib/file.dart';
diff --git a/dart/pkg/analysis_server/test/completion_test.dart b/dart/pkg/analysis_server/test/completion_test.dart
index de752be..1101d88 100644
--- a/dart/pkg/analysis_server/test/completion_test.dart
+++ b/dart/pkg/analysis_server/test/completion_test.dart
@@ -115,7 +115,7 @@
 class F {m() { m(); !1}}''', <String>["1+m"]);
 
     buildTests('testCommentSnippets017', '''
-class F {var x = !1false;}''', <String>["1+true"], failingTests: '1');
+class F {var x = !1false;}''', <String>["1+true"]);
 
     buildTests('testCommentSnippets018', '''
 class Map{}class Arrays{}class C{ m(!1){} n(!2 x, q)''',
@@ -1093,7 +1093,7 @@
 }''', <String>["1+a", "1-x", "1-y"], failingTests: '1');
 
     buildTests('testCompletion_import', '''
-import '!1';''', <String>["1+dart:!", "1+package:!"], failingTests: '1');
+import '!1';''', <String>["1+dart:!", "1+package:!"]);
 
     buildTests('testCompletion_import_dart', '''
 import 'dart:math
@@ -1109,7 +1109,7 @@
     buildTests('testCompletion_import_hasStringLiteral_noSemicolon', '''
 import '!1'
 
-class A {}''', <String>["1+dart:!", "1+package:!"], failingTests: '1');
+class A {}''', <String>["1+dart:!", "1+package:!"]);
 
     buildTests('testCompletion_import_noSpace', '''
 import!1''', <String>["1+ 'dart:!';", "1+ 'package:!';"], failingTests: '1');
@@ -1408,8 +1408,7 @@
 
     buildTests('testCompletion_staticField1', '''
 class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}''',
-        <String>["1+MAX_D", "X+xc", "Y+yc", "2+num", "3+num", "4+Sunflower"],
-        failingTests: '2');
+        <String>["1+MAX_D", "X+xc", "Y+yc", "2+num", "3+num", "4+Sunflower"]);
 
     buildTests('testCompletion_super_superType', '''
 class A {
@@ -1969,7 +1968,7 @@
       "J+if",
       "K+else",
       "L+return"
-    ], failingTests: '59BCHK');
+    ], failingTests: '35BCHK');
 
     // operators in function
     buildTests('test015', '''f(a,b,c) => a + b * c !1;''', <String>["1+=="],
@@ -1983,19 +1982,18 @@
 
     // keywords
     buildTests('test017', '''
-!1library foo;
-!2import 'x' !5as r;
+!1!2import 'x' !5as r;
 !3export '!8uri' !6hide Q !7show X;
 !4part 'x';''', <String>[
       "1+library",
-      "2+import",
+      "2+import '!';",
       "3+export",
       "4+part",
       "5+as",
       "6+hide",
       "7+show",
       "8-null"
-    ], failingTests: '1567');
+    ], failingTests: '567');
 
     // keywords
     buildTests('test018', '''!1part !2of foo;''', <String>["1+part", "2+of"],
@@ -2006,7 +2004,7 @@
 var falsetrue = 1;
 main() {
   var foo = true!1
-}''', <String>["1+true", "1+truefalse", "1-falsetrue"], failingTests: '1');
+}''', <String>["1+true", "1+truefalse", "1-falsetrue"]);
 
     buildTests('test020', '''var x = null.!1''', <String>["1+toString"],
         failingTests: '1');
diff --git a/dart/pkg/analysis_server/test/context_manager_test.dart b/dart/pkg/analysis_server/test/context_manager_test.dart
index 2be5cb8..59df06f 100644
--- a/dart/pkg/analysis_server/test/context_manager_test.dart
+++ b/dart/pkg/analysis_server/test/context_manager_test.dart
@@ -16,14 +16,14 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:path/path.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ContextManagerTest);
+  defineReflectiveTests(ContextManagerTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/domain_analysis_test.dart b/dart/pkg/analysis_server/test/domain_analysis_test.dart
index 7037f60..881315a 100644
--- a/dart/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/dart/pkg/analysis_server/test/domain_analysis_test.dart
@@ -13,18 +13,18 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:path/path.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
 import 'mock_sdk.dart';
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
 
-  runReflectiveTests(AnalysisDomainTest);
-  runReflectiveTests(SetSubscriptionsTest);
+  defineReflectiveTests(AnalysisDomainTest);
+  defineReflectiveTests(SetSubscriptionsTest);
 
   MockServerChannel serverChannel;
   MemoryResourceProvider resourceProvider;
diff --git a/dart/pkg/analysis_server/test/domain_completion_test.dart b/dart/pkg/analysis_server/test/domain_completion_test.dart
index 6ffc8ef..49b56a4 100644
--- a/dart/pkg/analysis_server/test/domain_completion_test.dart
+++ b/dart/pkg/analysis_server/test/domain_completion_test.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/completion/completion_core.dart'
+    show CompletionRequest;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/constants.dart';
@@ -23,18 +25,18 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
 import 'mock_sdk.dart';
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(CompletionManagerTest);
-  runReflectiveTests(CompletionTest);
-  runReflectiveTests(_NoSearchEngine);
+  defineReflectiveTests(CompletionManagerTest);
+  defineReflectiveTests(CompletionTest);
+  defineReflectiveTests(_NoSearchEngine);
 }
 
 @reflectiveTest
@@ -409,7 +411,7 @@
       expect(replacementOffset, equals(completionOffset - 2));
       expect(replacementLength, equals(2));
       assertHasResult(
-          CompletionSuggestionKind.KEYWORD, 'import', DART_RELEVANCE_HIGH);
+          CompletionSuggestionKind.KEYWORD, 'export', DART_RELEVANCE_HIGH);
       assertHasResult(
           CompletionSuggestionKind.KEYWORD, 'class', DART_RELEVANCE_HIGH);
     });
@@ -647,9 +649,10 @@
   final MockContext mockContext = new MockContext();
 
   Test_AnalysisServer(ServerCommunicationChannel channel,
-      ResourceProvider resourceProvider, OptimizingPubPackageMapProvider packageMapProvider,
-      Index index, AnalysisServerOptions analysisServerOptions,
-      DartSdk defaultSdk, InstrumentationService instrumentationService)
+      ResourceProvider resourceProvider,
+      OptimizingPubPackageMapProvider packageMapProvider, Index index,
+      AnalysisServerOptions analysisServerOptions, DartSdk defaultSdk,
+      InstrumentationService instrumentationService)
       : super(channel, resourceProvider, packageMapProvider, index,
           analysisServerOptions, defaultSdk, instrumentationService);
 
diff --git a/dart/pkg/analysis_server/test/edit/assists_test.dart b/dart/pkg/analysis_server/test/edit/assists_test.dart
index 0fcdb80..a24a048 100644
--- a/dart/pkg/analysis_server/test/edit/assists_test.dart
+++ b/dart/pkg/analysis_server/test/edit/assists_test.dart
@@ -7,15 +7,17 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:plugin/manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AssistsTest);
+  defineReflectiveTests(AssistsTest);
 }
 
 @reflectiveTest
@@ -39,7 +41,10 @@
   void setUp() {
     super.setUp();
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
   }
 
   Future test_removeTypeAnnotation() {
diff --git a/dart/pkg/analysis_server/test/edit/fixes_test.dart b/dart/pkg/analysis_server/test/edit/fixes_test.dart
index ff4bacd..7da3e75 100644
--- a/dart/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/dart/pkg/analysis_server/test/edit/fixes_test.dart
@@ -7,15 +7,17 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:plugin/manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(FixesTest);
+  defineReflectiveTests(FixesTest);
 }
 
 @reflectiveTest
@@ -24,7 +26,10 @@
   void setUp() {
     super.setUp();
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
   }
 
   Future test_fixUndefinedClass() {
diff --git a/dart/pkg/analysis_server/test/edit/format_test.dart b/dart/pkg/analysis_server/test/edit/format_test.dart
index f459900..c116db8 100644
--- a/dart/pkg/analysis_server/test/edit/format_test.dart
+++ b/dart/pkg/analysis_server/test/edit/format_test.dart
@@ -7,15 +7,18 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:plugin/manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
+import '../mocks.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(FormatTest);
+  defineReflectiveTests(FormatTest);
 }
 
 @reflectiveTest
@@ -24,7 +27,44 @@
   void setUp() {
     super.setUp();
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
+  }
+
+  Future test_formatNoOp() {
+    // Already formatted source
+    addTestFile('''
+main() {
+  int x = 3;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      EditFormatResult formatResult = _formatAt(0, 3);
+      expect(formatResult.edits, isNotNull);
+      expect(formatResult.edits, hasLength(0));
+    });
+  }
+
+  Future test_formatNoSelection() async {
+    addTestFile('''
+main() { int x = 3; }
+''');
+    await waitForTasksFinished();
+    EditFormatResult formatResult = _formatAt(0, 0);
+
+    expect(formatResult.edits, isNotNull);
+    expect(formatResult.edits, hasLength(1));
+
+    SourceEdit edit = formatResult.edits[0];
+    expect(edit.replacement, equals('''
+main() {
+  int x = 3;
+}
+'''));
+    expect(formatResult.selectionOffset, equals(0));
+    expect(formatResult.selectionLength, equals(0));
   }
 
   Future test_formatSimple() {
@@ -48,17 +88,14 @@
     });
   }
 
-  Future test_formatNoOp() {
-    // Already formatted source
+  Future test_withErrors() {
     addTestFile('''
-main() {
-  int x = 3;
-}
+main() { int x = 
 ''');
     return waitForTasksFinished().then((_) {
-      EditFormatResult formatResult = _formatAt(0, 3);
-      expect(formatResult.edits, isNotNull);
-      expect(formatResult.edits, hasLength(0));
+      Request request = new EditFormatParams(testFile, 0, 3).toRequest('0');
+      Response response = handler.handleRequest(request);
+      expect(response, isResponseFailure('0'));
     });
   }
 
diff --git a/dart/pkg/analysis_server/test/edit/refactoring_test.dart b/dart/pkg/analysis_server/test/edit/refactoring_test.dart
index 696c4e0..dac98eb 100644
--- a/dart/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/dart/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -7,27 +7,29 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:plugin/manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
 import '../mocks.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ConvertGetterMethodToMethodTest);
-  runReflectiveTests(ConvertMethodToGetterTest);
-  runReflectiveTests(ExtractLocalVariableTest);
-  runReflectiveTests(ExtractMethodTest);
-  runReflectiveTests(GetAvailableRefactoringsTest);
-  runReflectiveTests(InlineLocalTest);
-  runReflectiveTests(InlineMethodTest);
-  runReflectiveTests(MoveFileTest);
-  runReflectiveTests(RenameTest);
-  runReflectiveTests(_NoSearchEngine);
+  defineReflectiveTests(ConvertGetterMethodToMethodTest);
+  defineReflectiveTests(ConvertMethodToGetterTest);
+  defineReflectiveTests(ExtractLocalVariableTest);
+  defineReflectiveTests(ExtractMethodTest);
+  defineReflectiveTests(GetAvailableRefactoringsTest);
+  defineReflectiveTests(InlineLocalTest);
+  defineReflectiveTests(InlineMethodTest);
+  defineReflectiveTests(MoveFileTest);
+  defineReflectiveTests(RenameTest);
+  defineReflectiveTests(_NoSearchEngine);
 }
 
 @reflectiveTest
@@ -609,13 +611,6 @@
   List<RefactoringKind> kinds;
 
   /**
-   * Tests that there is a RENAME refactoring available at the [search] offset.
-   */
-  Future assertHasRenameRefactoring(String code, String search) async {
-    return assertHasKind(code, search, RefactoringKind.RENAME, true);
-  }
-
-  /**
    * Tests that there is refactoring of the given [kind] is available at the
    * [search] offset.
    */
@@ -632,6 +627,13 @@
     expect(kinds, matcher);
   }
 
+  /**
+   * Tests that there is a RENAME refactoring available at the [search] offset.
+   */
+  Future assertHasRenameRefactoring(String code, String search) async {
+    return assertHasKind(code, search, RefactoringKind.RENAME, true);
+  }
+
   @override
   Index createIndex() {
     return createLocalMemoryIndex();
@@ -667,10 +669,19 @@
   void setUp() {
     super.setUp();
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
     server.handlers = [handler];
   }
 
+  Future test_convertMethodToGetter_hasElement() {
+    return assertHasKind('''
+int getValue() => 42;
+''', 'getValue', RefactoringKind.CONVERT_METHOD_TO_GETTER, true);
+  }
+
   Future test_extractLocal() async {
     addTestFile('''
 main() {
@@ -683,12 +694,6 @@
     expect(kinds, contains(RefactoringKind.EXTRACT_METHOD));
   }
 
-  Future test_convertMethodToGetter_hasElement() {
-    return assertHasKind('''
-int getValue() => 42;
-''', 'getValue', RefactoringKind.CONVERT_METHOD_TO_GETTER, true);
-  }
-
   Future test_rename_hasElement_class() {
     return assertHasRenameRefactoring('''
 class Test {}
@@ -986,7 +991,7 @@
 
 @reflectiveTest
 class MoveFileTest extends _AbstractGetRefactoring_Test {
-  MoveFileOptions options = new MoveFileOptions(null);
+  MoveFileOptions options;
 
   test_OK() {
     resourceProvider.newFile('/project/bin/lib.dart', '');
@@ -994,7 +999,7 @@
 import 'dart:math';
 import 'lib.dart';
 ''');
-    options.newFile = '/project/test.dart';
+    _setOptions('/project/test.dart');
     return assertSuccessfulRefactoring(() {
       return _sendMoveRequest();
     }, '''
@@ -1009,6 +1014,10 @@
         .toRequest('0');
     return serverChannel.sendRequest(request);
   }
+
+  void _setOptions(String newFile) {
+    options = new MoveFileOptions(newFile);
+  }
 }
 
 @reflectiveTest
@@ -1702,9 +1711,12 @@
   @override
   void setUp() {
     super.setUp();
-    server.handlers = [new EditDomainHandler(server),];
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
+    server.handlers = [handler];
   }
 }
 
diff --git a/dart/pkg/analysis_server/test/edit/sort_members_test.dart b/dart/pkg/analysis_server/test/edit/sort_members_test.dart
index 967ef71..18d3052 100644
--- a/dart/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/dart/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -7,16 +7,18 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:plugin/manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
 import '../mocks.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(SortMembersTest);
+  defineReflectiveTests(SortMembersTest);
 }
 
 @reflectiveTest
@@ -27,7 +29,10 @@
   void setUp() {
     super.setUp();
     createProject();
-    handler = new EditDomainHandler(server);
+    ExtensionManager manager = new ExtensionManager();
+    ServerPlugin plugin = new ServerPlugin();
+    manager.processPlugins([plugin]);
+    handler = new EditDomainHandler(server, plugin);
   }
 
   Future test_BAD_doesNotExist() {
diff --git a/dart/pkg/analysis_server/test/integration/analysis/error_test.dart b/dart/pkg/analysis_server/test/integration/analysis/error_test.dart
index 2a76f3d..7337545 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.error;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(AnalysisErrorIntegrationTest);
+  defineReflectiveTests(AnalysisErrorIntegrationTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart b/dart/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
index 6a1a582..091eea6 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/get_errors_after_analysis_test.dart
@@ -4,11 +4,12 @@
 
 library test.integration.analysis.get.errors.after.analysis;
 
-import '../../reflective_tests.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
 import 'get_errors.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart b/dart/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
index a0920ca..34fa7e7 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/get_errors_before_analysis_test.dart
@@ -4,11 +4,12 @@
 
 library test.integration.analysis.get.errors.before.analysis;
 
-import '../../reflective_tests.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
 import 'get_errors.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/dart/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 7b5be4d..3928d99 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -8,13 +8,13 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:path/path.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(AnalysisGetHoverIntegrationTest);
+  defineReflectiveTests(AnalysisGetHoverIntegrationTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/dart/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index bb17256..b466ff6 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.highlights;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(AnalysisHighlightsTest);
+  defineReflectiveTests(AnalysisHighlightsTest);
 }
 
 @reflectiveTest
@@ -96,8 +96,14 @@
         highlights.remove(type);
       }
       check(HighlightRegionType.ANNOTATION, ['@override']);
-      check(HighlightRegionType.BUILT_IN,
-          ['as', 'get', 'import', 'set', 'static', 'typedef']);
+      check(HighlightRegionType.BUILT_IN, [
+        'as',
+        'get',
+        'import',
+        'set',
+        'static',
+        'typedef'
+      ]);
       check(HighlightRegionType.CLASS, [
         'Class',
         'Class2',
@@ -106,9 +112,8 @@
         'int'
       ]);
       check(HighlightRegionType.COMMENT_BLOCK, ['/* Block comment */']);
-      check(HighlightRegionType.COMMENT_DOCUMENTATION, [
-        '/**\n * Doc comment\n */'
-      ]);
+      check(HighlightRegionType.COMMENT_DOCUMENTATION,
+          ['/**\n * Doc comment\n */']);
       check(
           HighlightRegionType.COMMENT_END_OF_LINE, ['// End of line comment']);
       check(HighlightRegionType.CONSTRUCTOR, ['constructor']);
@@ -127,8 +132,10 @@
       check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
       check(HighlightRegionType.LITERAL_INTEGER, ['2', '42']);
       check(HighlightRegionType.LITERAL_LIST, ['[]']);
-      check(HighlightRegionType.LITERAL_MAP,
-          ['{1.0: [].toList()}', '{2: local}']);
+      check(HighlightRegionType.LITERAL_MAP, [
+        '{1.0: [].toList()}',
+        '{2: local}'
+      ]);
       check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
       check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
       check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
@@ -138,8 +145,10 @@
       check(HighlightRegionType.METHOD_STATIC, ['wait']);
       check(HighlightRegionType.PARAMETER, ['parameter']);
       check(HighlightRegionType.SETTER_DECLARATION, ['setter']);
-      check(HighlightRegionType.TOP_LEVEL_VARIABLE,
-          ['override', 'topLevelVariable']);
+      check(HighlightRegionType.TOP_LEVEL_VARIABLE, [
+        'override',
+        'topLevelVariable'
+      ]);
       check(HighlightRegionType.TYPE_NAME_DYNAMIC, ['dynamic']);
       check(HighlightRegionType.TYPE_PARAMETER, ['TypeParameter']);
       expect(highlights, isEmpty);
diff --git a/dart/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/dart/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 66de913..87b2e31 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.navigation;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(AnalysisNavigationTest);
+  defineReflectiveTests(AnalysisNavigationTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/dart/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 57405cf..5b084ec 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.occurrences;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/outline_test.dart b/dart/pkg/analysis_server/test/integration/analysis/outline_test.dart
index dcd6e3a..1369c3d 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.outline;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/dart/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index b5dfb6f..12872c2 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.overrides;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/dart/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 61974b0..bafba77 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -6,13 +6,13 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:path/path.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/dart/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 242ed66..806b82c 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -12,11 +12,12 @@
 
 import 'dart:async';
 
-import '../../reflective_tests.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/dart/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 59df3ed..79aee38 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.reanalyze;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/dart/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index 2450fd8..6bf7cd3 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.update.content.list;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/dart/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index b5a9b57..18da8a6 100644
--- a/dart/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/dart/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -5,13 +5,13 @@
 library test.integration.analysis.update.content;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/asynchrony_test.dart b/dart/pkg/analysis_server/test/integration/asynchrony_test.dart
index 238b586..79852cb 100644
--- a/dart/pkg/analysis_server/test/integration/asynchrony_test.dart
+++ b/dart/pkg/analysis_server/test/integration/asynchrony_test.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
 import 'integration_tests.dart';
 
 main() {
-//  runReflectiveTests(AsynchronyIntegrationTest);
+//  defineReflectiveTests(AsynchronyIntegrationTest);
 }
 
 /**
diff --git a/dart/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/dart/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index d9c85c1..12687e4 100644
--- a/dart/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/dart/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -5,13 +5,13 @@
 library test.integration.completion.get.suggestions;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/integration_test_methods.dart b/dart/pkg/analysis_server/test/integration/integration_test_methods.dart
index 86879e6..eba2bda 100644
--- a/dart/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/dart/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -1073,7 +1073,8 @@
    * If a request is made for a file which does not exist, or which is not
    * currently subject to analysis (e.g. because it is not associated with any
    * analysis root specified to analysis.setAnalysisRoots), an error of type
-   * FORMAT_INVALID_FILE will be generated.
+   * FORMAT_INVALID_FILE will be generated. If the source contains syntax
+   * errors, an error of type FORMAT_WITH_ERRORS will be generated.
    *
    * Parameters
    *
diff --git a/dart/pkg/analysis_server/test/integration/protocol_matchers.dart b/dart/pkg/analysis_server/test/integration/protocol_matchers.dart
index 83314f9..42d9ee9 100644
--- a/dart/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/dart/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1120,6 +1120,7 @@
  *   "hasNamedParameters": optional bool
  *   "parameterName": optional String
  *   "parameterType": optional String
+ *   "importUri": optional String
  * }
  */
 final Matcher isCompletionSuggestion = new LazyMatcher(() => new MatchesJsonObject(
@@ -1142,7 +1143,8 @@
     "requiredParameterCount": isInt,
     "hasNamedParameters": isBool,
     "parameterName": isString,
-    "parameterType": isString
+    "parameterType": isString,
+    "importUri": isString
   }));
 
 /**
@@ -1822,6 +1824,7 @@
  * enum {
  *   CONTENT_MODIFIED
  *   FORMAT_INVALID_FILE
+ *   FORMAT_WITH_ERRORS
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_ANALYSIS_ROOT
  *   INVALID_EXECUTION_CONTEXT
@@ -1843,6 +1846,7 @@
 final Matcher isRequestErrorCode = new MatchesEnum("RequestErrorCode", [
   "CONTENT_MODIFIED",
   "FORMAT_INVALID_FILE",
+  "FORMAT_WITH_ERRORS",
   "GET_ERRORS_INVALID_FILE",
   "INVALID_ANALYSIS_ROOT",
   "INVALID_EXECUTION_CONTEXT",
diff --git a/dart/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart b/dart/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
index d1f8726..fdab854 100644
--- a/dart/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
+++ b/dart/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
@@ -7,13 +7,13 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 /**
diff --git a/dart/pkg/analysis_server/test/integration/server/get_version_test.dart b/dart/pkg/analysis_server/test/integration/server/get_version_test.dart
index 779aff1..7f7b529 100644
--- a/dart/pkg/analysis_server/test/integration/server/get_version_test.dart
+++ b/dart/pkg/analysis_server/test/integration/server/get_version_test.dart
@@ -4,11 +4,12 @@
 
 library test.integration.server.get.version;
 
-import '../../reflective_tests.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart b/dart/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
index 721a607..bcf15db 100644
--- a/dart/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
+++ b/dart/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
@@ -4,13 +4,13 @@
 
 library test.integration.server.set.subscriptions.invalid.service;
 
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart b/dart/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
index 55c740a..517445b 100644
--- a/dart/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
+++ b/dart/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
@@ -7,13 +7,13 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/server/shutdown_test.dart b/dart/pkg/analysis_server/test/integration/server/shutdown_test.dart
index 09c4fe4..7a5de26 100644
--- a/dart/pkg/analysis_server/test/integration/server/shutdown_test.dart
+++ b/dart/pkg/analysis_server/test/integration/server/shutdown_test.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/integration/server/status_test.dart b/dart/pkg/analysis_server/test/integration/server/status_test.dart
index 4b1b86e..c386b88 100644
--- a/dart/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/dart/pkg/analysis_server/test/integration/server/status_test.dart
@@ -7,13 +7,13 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import '../integration_tests.dart';
 
 main() {
-  runReflectiveTests(Test);
+  defineReflectiveTests(Test);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/mock_sdk.dart b/dart/pkg/analysis_server/test/mock_sdk.dart
index 2cdebda..d23f7a5 100644
--- a/dart/pkg/analysis_server/test/mock_sdk.dart
+++ b/dart/pkg/analysis_server/test/mock_sdk.dart
@@ -316,7 +316,7 @@
   bool get isDocumented => throw unimplemented;
 
   @override
-  bool get isImplementation => throw unimplemented;
+  bool get isImplementation => false;
 
   @override
   bool get isInternal => shortName.startsWith('dart:_');
diff --git a/dart/pkg/analysis_server/test/operation/operation_queue_test.dart b/dart/pkg/analysis_server/test/operation/operation_queue_test.dart
index de5e795..71569e8 100644
--- a/dart/pkg/analysis_server/test/operation/operation_queue_test.dart
+++ b/dart/pkg/analysis_server/test/operation/operation_queue_test.dart
@@ -8,17 +8,19 @@
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/file_system/file_system.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:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
 import '../mocks.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ServerOperationQueueTest);
+  defineReflectiveTests(ServerOperationQueueTest);
 }
 
 /**
@@ -37,6 +39,15 @@
 }
 
 class AnalysisServerMock extends TypedMock implements AnalysisServer {
+
+  @override
+  final ResourceProvider resourceProvider;
+
+  @override
+  final SearchEngine searchEngine;
+
+  AnalysisServerMock({this.resourceProvider, this.searchEngine});
+
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
diff --git a/dart/pkg/analysis_server/test/protocol_server_test.dart b/dart/pkg/analysis_server/test/protocol_server_test.dart
index 26aae55..129c8cc 100644
--- a/dart/pkg/analysis_server/test/protocol_server_test.dart
+++ b/dart/pkg/analysis_server/test/protocol_server_test.dart
@@ -13,19 +13,19 @@
 import 'package:analyzer/src/generated/element.dart' as engine;
 import 'package:analyzer/src/generated/error.dart' as engine;
 import 'package:analyzer/src/generated/source.dart' as engine;
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
 import 'abstract_context.dart';
 import 'mocks.dart';
-import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(AnalysisErrorTest);
-  runReflectiveTests(ElementTest);
-  runReflectiveTests(ElementKindTest);
-  runReflectiveTests(EnumTest);
+  defineReflectiveTests(AnalysisErrorTest);
+  defineReflectiveTests(ElementTest);
+  defineReflectiveTests(ElementKindTest);
+  defineReflectiveTests(EnumTest);
 }
 
 class AnalysisErrorMock extends TypedMock implements engine.AnalysisError {
diff --git a/dart/pkg/analysis_server/test/protocol_test.dart b/dart/pkg/analysis_server/test/protocol_test.dart
index 3148cdf..ddd1b35 100644
--- a/dart/pkg/analysis_server/test/protocol_test.dart
+++ b/dart/pkg/analysis_server/test/protocol_test.dart
@@ -8,20 +8,19 @@
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import 'reflective_tests.dart';
-
-Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
-
 main() {
   groupSep = ' | ';
-  runReflectiveTests(NotificationTest);
-  runReflectiveTests(RequestTest);
-  runReflectiveTests(RequestErrorTest);
-  runReflectiveTests(ResponseTest);
+  defineReflectiveTests(NotificationTest);
+  defineReflectiveTests(RequestTest);
+  defineReflectiveTests(RequestErrorTest);
+  defineReflectiveTests(ResponseTest);
 }
 
+Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
+
 @reflectiveTest
 class InvalidParameterResponseMatcher extends Matcher {
   static const String ERROR_CODE = 'INVALID_PARAMETER';
@@ -110,8 +109,11 @@
     var trace = 'a stack trace\r\nbar';
     RequestError error = new RequestError(
         RequestErrorCode.UNKNOWN_REQUEST, 'msg', stackTrace: trace);
-    expect(error.toJson(),
-        {CODE: 'UNKNOWN_REQUEST', MESSAGE: 'msg', STACK_TRACE: trace});
+    expect(error.toJson(), {
+      CODE: 'UNKNOWN_REQUEST',
+      MESSAGE: 'msg',
+      STACK_TRACE: trace
+    });
   }
 }
 
diff --git a/dart/pkg/analysis_server/test/reflective_tests.dart b/dart/pkg/analysis_server/test/reflective_tests.dart
deleted file mode 100644
index 8180cf7..0000000
--- a/dart/pkg/analysis_server/test/reflective_tests.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// 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 reflective_tests;
-
-@MirrorsUsed(metaTargets: 'ReflectiveTest')
-import 'dart:mirrors';
-import 'dart:async';
-
-import 'package:unittest/unittest.dart';
-
-/**
- * Runs test methods existing in the given [type].
- *
- * Methods with names starting with `test` are run using [test] function.
- * Methods with names starting with `solo_test` are run using [solo_test] function.
- *
- * Each method is run with a new instance of [type].
- * So, [type] should have a default constructor.
- *
- * If [type] declares method `setUp`, it methods will be invoked before any test
- * method invocation.
- *
- * If [type] declares method `tearDown`, it will be invoked after any test
- * method invocation. If method returns [Future] to test some asyncronous
- * behavior, then `tearDown` will be invoked in `Future.complete`.
- */
-void runReflectiveTests(Type type) {
-  ClassMirror classMirror = reflectClass(type);
-  if (!classMirror.metadata.any((InstanceMirror annotation) =>
-      annotation.type.reflectedType == ReflectiveTest)) {
-    String name = MirrorSystem.getName(classMirror.qualifiedName);
-    throw new Exception('Class $name must have annotation "@reflectiveTest" '
-        'in order to be run by runReflectiveTests.');
-  }
-  String className = MirrorSystem.getName(classMirror.simpleName);
-  group(className, () {
-    classMirror.instanceMembers.forEach((symbol, memberMirror) {
-      // we need only methods
-      if (memberMirror is! MethodMirror || !memberMirror.isRegularMethod) {
-        return;
-      }
-      String memberName = MirrorSystem.getName(symbol);
-      // test_
-      if (memberName.startsWith('test_')) {
-        test(memberName, () {
-          return _runTest(classMirror, symbol);
-        });
-        return;
-      }
-      // solo_test_
-      if (memberName.startsWith('solo_test_')) {
-        solo_test(memberName, () {
-          return _runTest(classMirror, symbol);
-        });
-      }
-      // fail_test_
-      if (memberName.startsWith('fail_')) {
-        test(memberName, () {
-          return _runFailingTest(classMirror, symbol);
-        });
-      }
-      // solo_fail_test_
-      if (memberName.startsWith('solo_fail_')) {
-        solo_test(memberName, () {
-          return _runFailingTest(classMirror, symbol);
-        });
-      }
-    });
-  });
-}
-
-Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
-  var invocationResult = null;
-  try {
-    invocationResult = instanceMirror.invoke(symbol, []).reflectee;
-  } on NoSuchMethodError {}
-  if (invocationResult is Future) {
-    return invocationResult;
-  } else {
-    return new Future.value(invocationResult);
-  }
-}
-
-/**
- * Run a test that is expected to fail, and confirm that it fails.
- *
- * This properly handles the following cases:
- * - The test fails by throwing an exception
- * - The test returns a future which completes with an error.
- *
- * However, it does not handle the case where the test creates an asynchronous
- * callback using expectAsync(), and that callback generates a failure.
- */
-Future _runFailingTest(ClassMirror classMirror, Symbol symbol) {
-  return new Future(() => _runTest(classMirror, symbol)).then((_) {
-    fail('Test passed - expected to fail.');
-  }, onError: (_) {});
-}
-
-_runTest(ClassMirror classMirror, Symbol symbol) {
-  InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
-  return _invokeSymbolIfExists(instanceMirror, #setUp)
-      .then((_) => instanceMirror.invoke(symbol, []).reflectee)
-      .whenComplete(() => _invokeSymbolIfExists(instanceMirror, #tearDown));
-}
-
-/**
- * A marker annotation used to instruct dart2js to keep reflection information
- * for the annotated classes.
- */
-class ReflectiveTest {
-  const ReflectiveTest();
-}
-
-/**
- * A marker annotation used to instruct dart2js to keep reflection information
- * for the annotated classes.
- */
-const ReflectiveTest reflectiveTest = const ReflectiveTest();
diff --git a/dart/pkg/analysis_server/test/search/element_references_test.dart b/dart/pkg/analysis_server/test/search/element_references_test.dart
index bf27ea8..dce6b8c 100644
--- a/dart/pkg/analysis_server/test/search/element_references_test.dart
+++ b/dart/pkg/analysis_server/test/search/element_references_test.dart
@@ -8,15 +8,15 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/index/index.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
 import 'abstract_search_domain.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ElementReferencesTest);
-  runReflectiveTests(_NoSearchEngine);
+  defineReflectiveTests(ElementReferencesTest);
+  defineReflectiveTests(_NoSearchEngine);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/search/member_declarations_test.dart b/dart/pkg/analysis_server/test/search/member_declarations_test.dart
index f1b9391..849bb20 100644
--- a/dart/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/dart/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -7,14 +7,14 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
 import 'abstract_search_domain.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(MemberDeclarationsTest);
+  defineReflectiveTests(MemberDeclarationsTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/search/member_references_test.dart b/dart/pkg/analysis_server/test/search/member_references_test.dart
index 9c5c79a..79f159d 100644
--- a/dart/pkg/analysis_server/test/search/member_references_test.dart
+++ b/dart/pkg/analysis_server/test/search/member_references_test.dart
@@ -7,14 +7,14 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
 import 'abstract_search_domain.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(MemberReferencesTest);
+  defineReflectiveTests(MemberReferencesTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/search/search_result_test.dart b/dart/pkg/analysis_server/test/search/search_result_test.dart
index a4cd492..1b6f918 100644
--- a/dart/pkg/analysis_server/test/search/search_result_test.dart
+++ b/dart/pkg/analysis_server/test/search/search_result_test.dart
@@ -6,13 +6,12 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
-
 main() {
   groupSep = ' | ';
-  runReflectiveTests(SearchResultKindTest);
+  defineReflectiveTests(SearchResultKindTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/search/top_level_declarations_test.dart b/dart/pkg/analysis_server/test/search/top_level_declarations_test.dart
index a09a819..96ef6c6 100644
--- a/dart/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/dart/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -7,14 +7,14 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../reflective_tests.dart';
 import 'abstract_search_domain.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(TopLevelDeclarationsTest);
+  defineReflectiveTests(TopLevelDeclarationsTest);
 }
 
 @reflectiveTest
diff --git a/dart/pkg/analysis_server/test/search/type_hierarchy_test.dart b/dart/pkg/analysis_server/test/search/type_hierarchy_test.dart
index 5aba67c..ac45e26 100644
--- a/dart/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/dart/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -10,14 +10,14 @@
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(GetTypeHierarchyTest);
+  defineReflectiveTests(GetTypeHierarchyTest);
 }
 
 @reflectiveTest
@@ -114,9 +114,8 @@
 class A {}
 class B extends A {}
 ''');
-    packageMapProvider.packageMap['pkgA'] = [
-      resourceProvider.getResource('/packages/pkgA')
-    ];
+    packageMapProvider.packageMap['pkgA'] =
+        [resourceProvider.getResource('/packages/pkgA')];
     // reference the package from a project
     addTestFile('''
 import 'package:pkgA/libA.dart';
diff --git a/dart/pkg/analysis_server/test/services/completion/arglist_contributor_test.dart b/dart/pkg/analysis_server/test/services/completion/arglist_contributor_test.dart
index 64979d6..5218204 100644
--- a/dart/pkg/analysis_server/test/services/completion/arglist_contributor_test.dart
+++ b/dart/pkg/analysis_server/test/services/completion/arglist_contributor_test.dart
@@ -7,14 +7,14 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import 'completion_test_util.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ArgListContributorTest);
+  defineReflectiveTests(ArgListContributorTest);
 }
 
 @reflectiveTest
@@ -77,7 +77,7 @@
     for (String name in namedArguments) {
       expected.add(assertSuggest('$name: ',
           csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          relevance: DART_RELEVANCE_PARAMETER));
+          relevance: DART_RELEVANCE_NAMED_PARAMETER));
     }
     assertNoOtherSuggestions(expected);
   }
diff --git a/dart/pkg/analysis_server/test/services/completion/combinator_contributor_test.dart b/dart/pkg/analysis_server/test/services/completion/combinator_contributor_test.dart
index 01df6a0..60e402c 100644
--- a/dart/pkg/analysis_server/test/services/completion/combinator_contributor_test.dart
+++ b/dart/pkg/analysis_server/test/services/completion/combinator_contributor_test.dart
@@ -7,14 +7,14 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/combinator_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../reflective_tests.dart';
 import 'completion_test_util.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(CombinatorContributorTest);
+  defineReflectiveTests(CombinatorContributorTest);
 }
 
 @reflectiveTest
@@ -68,8 +68,8 @@
       assertSuggestClass('PB',
           relevance: DART_RELEVANCE_DEFAULT,
           kind: CompletionSuggestionKind.IDENTIFIER);
-      assertSuggestTopLevelVar('T1', null,
-          DART_RELEVANCE_DEFAULT, CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestTopLevelVar('T1', null, DART_RELEVANCE_DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunction('F1', 'PB',
           kind: CompletionSuggestionKind.IDENTIFIER);
       assertNotSuggested('C');
@@ -111,15 +111,15 @@
       assertSuggestClass('PB',
           relevance: DART_RELEVANCE_DEFAULT,
           kind: CompletionSuggestionKind.IDENTIFIER);
-      assertSuggestTopLevelVar('T1', null,
-          DART_RELEVANCE_DEFAULT, CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestTopLevelVar('T1', null, DART_RELEVANCE_DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
       assertSuggestFunction('F1', 'PB',
           kind: CompletionSuggestionKind.IDENTIFIER);
       assertSuggestClass('Clz',
           relevance: DART_RELEVANCE_DEFAULT,
           kind: CompletionSuggestionKind.IDENTIFIER);
-      assertSuggestFunctionTypeAlias('F2', null,
-          false, DART_RELEVANCE_DEFAULT, CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestFunctionTypeAlias('F2', null, false, DART_RELEVANCE_DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
       assertNotSuggested('C');
       assertNotSuggested('D');
       assertNotSuggested('X');
diff --git a/dart/pkg/analysis_server/test/services/completion/common_usage_computer_test.dart b/dart/pkg/analysis_server/test/services/completion/common_usage_computer_test.dart
index a1d86e0..9a46aac 100644
--- a/dart/pkg/analysis_server/test/services/completion/common_usage_computer_test.dart
+++ b/dart/pkg/analysis_server/test/services/completion/common_usage_computer_test.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/analysis_server.dart'
+    show ContextSourcePair;
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -16,16 +18,15 @@
 import 'package:analysis_server/src/services/index/local_memory_index.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 '../../analysis_abstract.dart';
 import '../../mocks.dart';
-import '../../reflective_tests.dart';
-import 'package:analysis_server/src/analysis_server.dart' show ContextSourcePair;
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(CommonUsageComputerTest);
+  defineReflectiveTests(CommonUsageComputerTest);
 }
 
 @reflectiveTest
@@ -140,8 +141,8 @@
     expect(replacementOffset, equals(completionOffset));
     expect(replacementLength, equals(0));
     assertHasResult(CompletionSuggestionKind.INVOCATION, 'delayed');
-    assertHasResult(CompletionSuggestionKind.INVOCATION,
-        'value', DART_RELEVANCE_COMMON_USAGE);
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'value',
+        DART_RELEVANCE_COMMON_USAGE);
     assertNoResult('Future');
     assertNoResult('Object');
     assertNoResult('A');
@@ -209,8 +210,8 @@
     expect(replacementOffset, equals(completionOffset));
     expect(replacementLength, equals(0));
     assertHasResult(CompletionSuggestionKind.INVOCATION, 'nextBool');
-    assertHasResult(CompletionSuggestionKind.INVOCATION,
-        'nextDouble', DART_RELEVANCE_COMMON_USAGE - 1);
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'nextDouble',
+        DART_RELEVANCE_COMMON_USAGE - 1);
     assertHasResult(CompletionSuggestionKind.INVOCATION, 'nextInt',
         DART_RELEVANCE_COMMON_USAGE);
     assertNoResult('Random');
diff --git a/dart/pkg/analysis_server/test/services/completion/completion_computer_test.dart b/dart/pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 50fee60..5b23689 100644
--- a/dart/pkg/analysis_server/test/services/completion/completion_computer_test.dart
+++ b/dart/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -6,6 +6,9 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/completion/completion_core.dart'
+    show CompletionRequest;
+import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
@@ -15,14 +18,15 @@
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loa