anchor.diff:              let docIds = documents |> List.map ^ fun doc -> doc.Id
               transientDocuments.TryAdd (fileName, docIds) |> ignore
               transientDocumentIds.UnionWith docIds
  -        documents |> List.iter ^ fun doc -> workspace.AddDocument doc |> ignore
  +        documents |> List.iter ^ fun doc -> self.AddDocument doc |> ignore
           true
   
  -    member __.ApplyTextChanges (docId:DocumentId) (textChanges:LinePositionSpanTextChange seq) = async {
  +    new () = new FSharpWorkspace (Host.Mef.DesktopMefHostServices.DefaultServices)
  +
  +//    new (aggregator:HostServicesAggregator) = new FSharpWorkspace (aggregator.CreateHostServices())
  +//    new () = new FSharpWorkspace(FSharpHostService())
  +
  +    member __.WorkspaceEvents = eventStream
  +
  +    member self.ApplyTextChanges (docId:DocumentId) (textChanges:LinePositionSpanTextChange seq) = async {
           if Seq.isEmpty textChanges then return () else
  -        match workspace.CurrentSolution.TryGetDocument docId with
  +        match self.CurrentSolution.TryGetDocument docId with
           | Some doc ->
               let! (sourceText:SourceText) = doc.GetTextAsync ()
               let sourceText =
  
positive.code:                     sourceText.WithChanges [| 
                          TextChange (TextSpan (startOffset, endOffset - startOffset), bufferChange.NewText) 
                      |]
                  workspace.OnDocumentChanged (docId, sourceText)
          else
              tryAddTransientDocument bufferChange.FileName bufferChange.NewText |> ignore
      }
  
      // TODO - This probaly needs to be expanded substantially to account for more workspace events
      member __.OnWorkspaceChanged (args:WorkspaceChangeEventArgs) =
          let filename =
              match args.Kind with
              | WorkspaceChangeKind.DocumentAdded   -> (args.NewSolution.GetDocument args.DocumentId).FilePath
  
negative.code:                     sourceText.WithChanges [| 
                          TextChange (TextSpan (startOffset, endOffset - startOffset), change.NewText) 
                      |]
              self.OnDocumentChanged (docId, sourceText)
          | None -> ()
      }
  
      member self.UpdateBuffer (bufferChange:BufferUpdate) = async {
          if isNull bufferChange.FileName then () else
          let documentIds = self.CurrentSolution.GetDocumentIdsWithFilePath bufferChange.FileName
          if not documentIds.IsEmpty then
              for docId in documentIds do
                  let doc = self.CurrentSolution.GetDocument docId
                  let! sourceText = doc.GetTextAsync () |> Async.AwaitTask
                  let startOffset =
                      sourceText.Lines.GetPosition ^ LinePosition (bufferChange.StartLine, bufferChange.StartLine)
  