anchor.diff:      let documentUpdater = DocumentUpdater(serviceProvider)
   
       let canRename() = 
  -        state <- Option.map (fun s -> { s with Word = vsLanguageService.GetSymbol(s.Point, s.Project) } ) state
  -        state |> Option.bind (fun s -> s.Word) |> Option.isSome
  -
  -    let updateAtCaretPosition () =
  -        maybe {
  -            let! point = view.TextBuffer.GetSnapshotPoint view.Caret.Position
  -            // If the new cursor position is still within the current word (and on the same snapshot),
  -            // we don't need to check it.
  -            match state with
  -            | Some { Word = Some (cw,_) } when cw.Snapshot = view.TextSnapshot && point.InSpan cw -> ()
  -            | _ ->
  +        let s =
  +            maybe {
  +                let! caretPos = view.TextBuffer.GetSnapshotPoint view.Caret.Position
                   let dte = serviceProvider.GetService<EnvDTE.DTE, SDTE>()
                   let! doc = dte.GetActiveDocument()
                   let! project = ProjectProvider.createForDocument doc
  -                state <- Some
  -                    { Project =  project
  -                      File = doc.FullName
  -                      Word = None
  -                      Point = point } } |> ignore
  -
  -    let _ = DocumentEventsListener (view, updateAtCaretPosition)
  +                return { Word = vsLanguageService.GetSymbol(caretPos, project); File = doc.FullName; Project = project }
  +            }
  +        state <- s
  +        state |> Option.bind (fun s -> s.Word) |> Option.isSome
   
       let rename (oldText: string) (newText: string) (foundUsages: (string * range list) list) =
           try
  
positive.code: 
  [<NoEquality; NoComparison>]
  type DocumentState =
      { Point: SnapshotPoint
        Word: (SnapshotSpan * Symbol) option
        File: string
        Project: IProjectProvider }
  
  
negative.code:     member x.HandleRename() =
          maybe {
              let! state = state
              let! cw, sym = state.Word
              let! symbol, fileScopedCheckResults = 
                  // We pass AllowStaleResults.No here because we really need a 100% accurate symbol w.r.t. all prior files,
  