anchor.diff:      });
     }
   
  -  Future<AnalysisUpdateContentResult> sendAddOverlay(String path, String contents) {
  -    var overlay = new AddContentOverlay(contents);
  -    var params = new AnalysisUpdateContentParams({path: overlay}).toJson();
  +  Future<AnalysisUpdateContentResult> sendAddOverlays(
  +      Map<String, String> overlays) {
  +    var updateMap = {};
  +    for (String path in overlays.keys) {
  +      updateMap.putIfAbsent(path, () => new AddContentOverlay(overlays[path]));
  +    }
  +
  +    var params = new AnalysisUpdateContentParams(updateMap).toJson();
       _logger.fine("About to send analysis.updateContent");
       return send("analysis.updateContent", params).then((result) {
         _logger.fine("analysis.updateContent -> then");
  
positive.code:   Future<EditFormatResult> sendFormat(int selectionOffset,
      [int selectionLength = 0]) {
  
      String file = psuedoFilePath;
      var params = new EditFormatParams(
          file, selectionOffset, selectionLength).toJson();
  
      return send("edit.format", params).then((result) {
        ResponseDecoder decoder = new ResponseDecoder(null);
  
negative.code:     });
    }
  
    Future<AnalysisUpdateContentResult> sendRemoveOverlays(List<String> paths) {
      var updateMap = {};
      var overlay = new RemoveContentOverlay();
      paths.forEach((String path) => updateMap.putIfAbsent(path, () => overlay));
  
      var params = new AnalysisUpdateContentParams(updateMap).toJson();
      _logger.fine("About to send analysis.updateContent - remove overlay");
      return send("analysis.updateContent", params).then((result) {
        _logger.fine("analysis.updateContent -> then");
  