diff --git a/pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart
deleted file mode 100644
index 384bb57..0000000
--- a/pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart
+++ /dev/null
@@ -1,237 +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 services.completion.suggestion;
-
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/services/json.dart';
-import 'package:analyzer/src/generated/element.dart';
-
-/**
- * An enumeration of the relevance of a completion suggestion.
- */
-class CompletionRelevance {
-  static const CompletionRelevance LOW = const CompletionRelevance('LOW');
-  static const CompletionRelevance DEFAULT =
-      const CompletionRelevance('DEFAULT');
-  static const CompletionRelevance HIGH = const CompletionRelevance('HIGH');
-
-  final String name;
-
-  const CompletionRelevance(this.name);
-
-  static CompletionRelevance value(String name) {
-    if (LOW.name == name) return LOW;
-    if (DEFAULT.name == name) return DEFAULT;
-    if (HIGH.name == name) return HIGH;
-    throw new ArgumentError('Unknown CompletionRelevance: $name');
-  }
-
-  toString() => 'CompletionRelevance.$name';
-}
-
-/**
- * A single completion suggestion.
- */
-class CompletionSuggestion implements HasToJson {
-
-  /**
-   *  The kind of element being suggested.
-   */
-  final CompletionSuggestionKind kind;
-
-  /**
-   * The relevance of this completion suggestion.
-   */
-  final CompletionRelevance relevance;
-
-  /**
-   * 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.
-   */
-  final String completion;
-
-  /**
-   * The offset, relative to the beginning of the completion, of where
-   * the selection should be placed after insertion.
-   */
-  final int selectionOffset;
-
-  /**
-   * The number of characters that should be selected after insertion.
-   */
-  final int selectionLength;
-
-  /**
-   * `true` if the suggested element is deprecated.
-   */
-  final bool isDeprecated;
-
-  /**
-   * True if the element is not known to be valid for the target.
-   * This happens if the type of the target is dynamic.
-   */
-  final bool isPotential;
-
-  // optional fields
-
-//  final String docSummary;
-//  final String docComplete;
-//  final String declaringType;
-//  final String returnType;
-//  final List<String> parameterNames;
-//  final List<String> parameterTypes;
-//  final int requiredParameterCount;
-//  final int positionalParameterCount;
-//  final String parameterName;
-//  final String parameterType;
-
-  CompletionSuggestion(this.kind, this.relevance, this.completion,
-      this.selectionOffset, this.selectionLength, this.isDeprecated,
-      this.isPotential);
-
-  factory CompletionSuggestion.fromJson(Map<String, Object> json) {
-    return new CompletionSuggestion(
-        CompletionSuggestionKind.valueOf(json[KIND]),
-        CompletionRelevance.value(json[RELEVANCE]),
-        json[COMPLETION],
-        json[SELECTION_OFFSET],
-        json[SELECTION_LENGTH],
-        json[IS_DEPRECATED],
-        json[IS_POTENTIAL]);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      KIND: kind.name,
-      RELEVANCE: relevance.name,
-      COMPLETION: completion,
-      SELECTION_OFFSET: selectionOffset,
-      SELECTION_LENGTH: selectionLength,
-      IS_DEPRECATED: isDeprecated,
-      IS_POTENTIAL: isPotential
-    };
-  }
-}
-
-/**
- * An enumeration of the kinds of elements that can be included
- * in a completion suggestion.
- */
-class CompletionSuggestionKind {
-  static const CompletionSuggestionKind ARGUMENT_LIST =
-      const CompletionSuggestionKind('ARGUMENT_LIST');
-  static const CompletionSuggestionKind CLASS =
-      const CompletionSuggestionKind('CLASS');
-  static const CompletionSuggestionKind CLASS_ALIAS =
-      const CompletionSuggestionKind('CLASS_ALIAS');
-  static const CompletionSuggestionKind CONSTRUCTOR =
-      const CompletionSuggestionKind('CONSTRUCTOR');
-  static const CompletionSuggestionKind FIELD =
-      const CompletionSuggestionKind('FIELD');
-  static const CompletionSuggestionKind FUNCTION =
-      const CompletionSuggestionKind('FUNCTION');
-  static const CompletionSuggestionKind FUNCTION_TYPE_ALIAS =
-      const CompletionSuggestionKind('FUNCTION_TYPE_ALIAS');
-  static const CompletionSuggestionKind GETTER =
-      const CompletionSuggestionKind('GETTER');
-  static const CompletionSuggestionKind IMPORT =
-      const CompletionSuggestionKind('IMPORT');
-  static const CompletionSuggestionKind KEYWORD =
-      const CompletionSuggestionKind('KEYWORD');
-  static const CompletionSuggestionKind LIBRARY_PREFIX =
-      const CompletionSuggestionKind('LIBRARY_PREFIX');
-  static const CompletionSuggestionKind LOCAL_VARIABLE =
-      const CompletionSuggestionKind('LOCAL_VARIABLE');
-  static const CompletionSuggestionKind METHOD =
-      const CompletionSuggestionKind('METHOD');
-  static const CompletionSuggestionKind METHOD_NAME =
-      const CompletionSuggestionKind('METHOD_NAME');
-  static const CompletionSuggestionKind NAMED_ARGUMENT =
-      const CompletionSuggestionKind('NAMED_ARGUMENT');
-  static const CompletionSuggestionKind OPTIONAL_ARGUMENT =
-      const CompletionSuggestionKind('OPTIONAL_ARGUMENT');
-  static const CompletionSuggestionKind PARAMETER =
-      const CompletionSuggestionKind('PARAMETER');
-  static const CompletionSuggestionKind SETTER =
-      const CompletionSuggestionKind('SETTER');
-  static const CompletionSuggestionKind TOP_LEVEL_VARIABLE =
-      const CompletionSuggestionKind('TOP_LEVEL_VARIABLE');
-  static const CompletionSuggestionKind TYPE_PARAMETER =
-      const CompletionSuggestionKind('TYPE_PARAMETER');
-
-  final String name;
-
-  const CompletionSuggestionKind(this.name);
-
-  @override
-  String toString() => name;
-
-  static CompletionSuggestionKind fromElementKind(ElementKind kind) {
-    //    ElementKind.ANGULAR_FORMATTER,
-    //    ElementKind.ANGULAR_COMPONENT,
-    //    ElementKind.ANGULAR_CONTROLLER,
-    //    ElementKind.ANGULAR_DIRECTIVE,
-    //    ElementKind.ANGULAR_PROPERTY,
-    //    ElementKind.ANGULAR_SCOPE_PROPERTY,
-    //    ElementKind.ANGULAR_SELECTOR,
-    //    ElementKind.ANGULAR_VIEW,
-    if (kind == ElementKind.CLASS) return CLASS;
-    //    ElementKind.COMPILATION_UNIT,
-    if (kind == ElementKind.CONSTRUCTOR) return CONSTRUCTOR;
-    //    ElementKind.DYNAMIC,
-    //    ElementKind.EMBEDDED_HTML_SCRIPT,
-    //    ElementKind.ERROR,
-    //    ElementKind.EXPORT,
-    //    ElementKind.EXTERNAL_HTML_SCRIPT,
-    if (kind == ElementKind.FIELD) return FIELD;
-    if (kind == ElementKind.FUNCTION) return FUNCTION;
-    if (kind == ElementKind.FUNCTION_TYPE_ALIAS) return FUNCTION_TYPE_ALIAS;
-    if (kind == ElementKind.GETTER) return GETTER;
-    //    ElementKind.HTML,
-    if (kind == ElementKind.IMPORT) return IMPORT;
-    //    ElementKind.LABEL,
-    //    ElementKind.LIBRARY,
-    if (kind == ElementKind.LOCAL_VARIABLE) return LOCAL_VARIABLE;
-    if (kind == ElementKind.METHOD) return METHOD;
-    //    ElementKind.NAME,
-    if (kind == ElementKind.PARAMETER) return PARAMETER;
-    //    ElementKind.POLYMER_ATTRIBUTE,
-    //    ElementKind.POLYMER_TAG_DART,
-    //    ElementKind.POLYMER_TAG_HTML,
-    //    ElementKind.PREFIX,
-    if (kind == ElementKind.SETTER) return SETTER;
-    if (kind == ElementKind.TOP_LEVEL_VARIABLE) return TOP_LEVEL_VARIABLE;
-    //    ElementKind.TYPE_PARAMETER,
-    //    ElementKind.UNIVERSE
-    throw new ArgumentError('Unknown CompletionSuggestionKind for: $kind');
-  }
-
-  static CompletionSuggestionKind valueOf(String name) {
-    if (ARGUMENT_LIST.name == name) return ARGUMENT_LIST;
-    if (CLASS.name == name) return CLASS;
-    if (CLASS_ALIAS.name == name) return CLASS_ALIAS;
-    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
-    if (FIELD.name == name) return FIELD;
-    if (FUNCTION.name == name) return FUNCTION;
-    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
-    if (GETTER.name == name) return GETTER;
-    if (IMPORT.name == name) return IMPORT;
-    if (KEYWORD.name == name) return KEYWORD;
-    if (LIBRARY_PREFIX.name == name) return LIBRARY_PREFIX;
-    if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
-    if (METHOD.name == name) return METHOD;
-    if (METHOD_NAME.name == name) return METHOD_NAME;
-    if (NAMED_ARGUMENT.name == name) return NAMED_ARGUMENT;
-    if (OPTIONAL_ARGUMENT.name == name) return OPTIONAL_ARGUMENT;
-    if (PARAMETER.name == name) return PARAMETER;
-    if (SETTER.name == name) return SETTER;
-    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
-    if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER;
-    throw new ArgumentError('Unknown CompletionSuggestionKind: $name');
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/change.dart b/pkg/analysis_server/lib/src/services/correction/change.dart
deleted file mode 100644
index 71383f7..0000000
--- a/pkg/analysis_server/lib/src/services/correction/change.dart
+++ /dev/null
@@ -1,361 +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 services.correction.change;
-
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/services/json.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-
-/**
- * A description of a single change to one or more files. 
- */
-class Change implements HasToJson {
-  /**
-   * A textual description of the change to be applied. 
-   */
-  final String message;
-
-  /**
-   * A list of the [FileEdit]s used to effect the change. 
-   */
-  final List<FileEdit> fileEdits = <FileEdit>[];
-
-  /**
-   * A list of the [LinkedEditGroup]s in the change. 
-   */
-  final List<LinkedEditGroup> linkedEditGroups = <LinkedEditGroup>[];
-
-  /**
-   * The position that should be selected after the edits have been applied.
-   */
-  Position selection;
-
-  Change(this.message);
-
-  /**
-   * Adds [edit] to the [FileEdit] for the given [file].
-   */
-  void addEdit(String file, Edit edit) {
-    FileEdit fileEdit = getFileEdit(file);
-    if (fileEdit == null) {
-      fileEdit = new FileEdit(file);
-      addFileEdit(fileEdit);
-    }
-    fileEdit.add(edit);
-  }
-
-  /**
-   * Adds the given [FileEdit].
-   */
-  void addFileEdit(FileEdit edit) {
-    fileEdits.add(edit);
-  }
-
-  /**
-   * Adds the given [LinkedEditGroup].
-   */
-  void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) {
-    linkedEditGroups.add(linkedEditGroup);
-  }
-
-  /**
-   * Returns the [FileEdit] for the given [file], maybe `null`.
-   */
-  FileEdit getFileEdit(String file) {
-    for (FileEdit fileEdit in fileEdits) {
-      if (fileEdit.file == file) {
-        return fileEdit;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      MESSAGE: message,
-      EDITS: objectToJson(fileEdits),
-      LINKED_EDIT_GROUPS: objectToJson(linkedEditGroups)
-    };
-    if (selection != null) {
-      json[SELECTION] = selection.toJson();
-    }
-    return json;
-  }
-
-  @override
-  String toString() =>
-      'Change(message=$message, edits=$fileEdits, '
-          'linkedEditGroups=$linkedEditGroups, selection=$selection)';
-}
-
-
-/**
- * A description of a single change to a single file. 
- */
-class Edit implements HasToJson {
-  /**
-   * The offset of the region to be modified. 
-   */
-  final int offset;
-
-  /**
-   * The length of the region to be modified.
-   */
-  final int length;
-
-  /**
-   * The text that is to replace the specified region in the original text. 
-   */
-  final String replacement;
-
-  /**
-   * 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.
-   */
-  String id;
-
-  Edit(this.offset, this.length, this.replacement);
-
-  Edit.range(SourceRange range, String replacement)
-      : this(range.offset, range.length, replacement);
-
-  /**
-   * The offset of a character immediately after the region to be modified. 
-   */
-  int get end => offset + length;
-
-  bool operator ==(other) {
-    if (other is Edit) {
-      return other.offset == offset &&
-          other.length == length &&
-          other.replacement == replacement;
-    }
-    return false;
-  }
-
-  /**
-   * Get the result of applying the edit to the given [code].
-   */
-  String apply(String code) {
-    return code.substring(0, offset) + replacement + code.substring(end);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      OFFSET: offset,
-      LENGTH: length,
-      REPLACEMENT: replacement
-    };
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('Edit(offset=');
-    sb.write(offset);
-    sb.write(', length=');
-    sb.write(length);
-    sb.write(', replacement=:>');
-    sb.write(replacement);
-    sb.write('<:');
-    if (id != null) {
-      sb.write(', id=');
-      sb.write(id);
-    }
-    sb.write(')');
-    return sb.toString();
-  }
-
-  /**
-   * Get the result of applying a set of [edits] to the given [code].  Edits
-   * are applied in the order they appear in [edits].
-   */
-  static String applySequence(String code, Iterable<Edit> edits) {
-    edits.forEach((Edit edit) {
-      code = edit.apply(code);
-    });
-    return code;
-  }
-}
-
-
-/**
- * A description of a set of changes to a single file.
- *
- * [Edit]s are added in the order of decreasing offset, so they are easy to
- * apply to the original file content without correcting offsets.
- */
-class FileEdit implements HasToJson {
-  /**
-   * The file to be modified.
-   */
-  final String file;
-
-  /**
-   * A list of the [Edit]s used to effect the change. 
-   */
-  final List<Edit> edits = <Edit>[];
-
-  FileEdit(this.file);
-
-  /**
-   * Adds the given [Edit] to the list.
-   */
-  void add(Edit edit) {
-    int index = 0;
-    while (index < edits.length && edits[index].offset > edit.offset) {
-      index++;
-    }
-    edits.insert(index, edit);
-  }
-
-  /**
-   * Adds the given [Edit]s.
-   */
-  void addAll(Iterable<Edit> edits) {
-    edits.forEach(add);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      FILE: file,
-      EDITS: objectToJson(edits)
-    };
-  }
-
-  @override
-  String toString() => "FileEdit(file=$file, edits=$edits)";
-}
-
-
-/**
- * A group of linked [Position]s in multiple files that are simultaneously
- * modified - if one gets edited, all other positions in a group are edited the
- * same way. All linked positions in a group have the same content.
- */
-class LinkedEditGroup implements HasToJson {
-  final String id;
-  int length;
-  final List<Position> positions = <Position>[];
-  final List<LinkedEditSuggestion> suggestions = <LinkedEditSuggestion>[];
-
-  LinkedEditGroup(this.id);
-
-  void addPosition(Position position, int length) {
-    positions.add(position);
-    this.length = length;
-  }
-
-  void addSuggestion(LinkedEditSuggestion suggestion) {
-    suggestions.add(suggestion);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      ID: id,
-      LENGTH: length,
-      POSITIONS: objectToJson(positions),
-      SUGGESTIONS: objectToJson(suggestions)
-    };
-  }
-
-  @override
-  String toString() =>
-      'LinkedEditGroup(id=$id, length=$length, '
-          'positions=$positions, suggestions=$suggestions)';
-}
-
-
-/**
- * A suggestion of a value that could be used to replace all of the linked edit
- * regions in a [LinkedEditGroup].
- */
-class LinkedEditSuggestion implements HasToJson {
-  final LinkedEditSuggestionKind kind;
-  final String value;
-
-  LinkedEditSuggestion(this.kind, this.value);
-
-  bool operator ==(other) {
-    if (other is LinkedEditSuggestion) {
-      return other.kind == kind && other.value == value;
-    }
-    return false;
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      KIND: kind.name,
-      VALUE: value
-    };
-  }
-
-  @override
-  String toString() => '(kind=$kind, value=$value)';
-}
-
-
-/**
- * An enumeration of the kind of values that can be suggested for a linked edit.
- */
-class LinkedEditSuggestionKind {
-  static const METHOD = const LinkedEditSuggestionKind('METHOD');
-  static const PARAMETER = const LinkedEditSuggestionKind('PARAMETER');
-  static const TYPE = const LinkedEditSuggestionKind('TYPE');
-  static const VARIABLE = const LinkedEditSuggestionKind('VARIABLE');
-  final String name;
-
-  const LinkedEditSuggestionKind(this.name);
-
-  @override
-  String toString() => name;
-}
-
-
-/**
- * A position in a file.
- */
-class Position implements HasToJson {
-  final String file;
-  final int offset;
-
-  Position(this.file, this.offset);
-
-  int get hashCode {
-    int hash = file.hashCode;
-    hash = hash * 31 + offset;
-    return hash;
-  }
-
-  bool operator ==(other) {
-    if (other is Position) {
-      return other.file == file && other.offset == offset;
-    }
-    return false;
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      FILE: file,
-      OFFSET: offset
-    };
-  }
-
-  @override
-  String toString() => 'Position(file=$file, offset=$offset)';
-}
diff --git a/pkg/analysis_server/lib/src/services/json.dart b/pkg/analysis_server/lib/src/services/json.dart
deleted file mode 100644
index 1727d5e..0000000
--- a/pkg/analysis_server/lib/src/services/json.dart
+++ /dev/null
@@ -1,30 +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 services.json;
-
-/**
- * Instances of the class [HasToJson] implement [toJson] method that returns
- * a JSON presentation.
- */
-abstract class HasToJson {
-  /**
-   * Returns a JSON presentation of the object.
-   */
-  Map<String, Object> toJson();
-}
-
-
-/**
- * Returns a JSON presention of [value].
- */
-objectToJson(Object value) {
-  if (value is HasToJson) {
-    return value.toJson();
-  }
-  if (value is Iterable) {
-    return value.map((item) => objectToJson(item)).toList();
-  }
-  return value;
-}
diff --git a/tools/VERSION b/tools/VERSION
index 4f39310..63249d8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 7
 PATCH 0
 PRERELEASE 0
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1
