anchor.diff:      let updateAtCaretPosition() =
           asyncMaybe {
               let! point = buffer.GetSnapshotPoint view.Caret.Position |> liftMaybe
  -            let dte = serviceProvider.GetService<EnvDTE.DTE, SDTE>()
  -            let! doc = dte.GetActiveDocument() |> liftMaybe
  -            let! project = ProjectProvider.createForDocument doc |> liftMaybe
  -            let! newWord, symbol = vsLanguageService.GetSymbol(point, project) |> liftMaybe
  -
  -            match symbol.Kind with
  -            | SymbolKind.Ident ->
  -                let! interfaceState = queryInterfaceState point doc project
  -                let! (fsSymbolUse, results) = 
  -                    vsLanguageService.GetFSharpSymbolUse (newWord, symbol, doc.FullName, project, AllowStaleResults.MatchingSource)
  -                // Recheck cursor position to ensure it's still in new word
  -                let! point = buffer.GetSnapshotPoint view.Caret.Position |> liftMaybe
  -                return! 
  -                    (if (fsSymbolUse.Symbol :? FSharpEntity) && point.InSpan newWord then
  -                        let entity = fsSymbolUse.Symbol :?> FSharpEntity
  -                        // The entity might correspond to another symbol so we check for symbol text and start ranges as well
  -                        if InterfaceStubGenerator.isInterface entity && entity.DisplayName = symbol.Text 
  -                            && hasSameStartPos fsSymbolUse.RangeAlternate interfaceState.InterfaceData.Range then
  -                            Some (newWord, (interfaceState, fsSymbolUse.DisplayContext, entity, results))
  -                        else None
  -                     else None) |> liftMaybe
  -            | _ -> return! (liftMaybe None)
  +            match currentWord with
  +            | Some word when point.InSpan word -> 
  +                return! liftMaybe state
  +            | _ ->
  +                let dte = serviceProvider.GetService<EnvDTE.DTE, SDTE>()
  +                let! doc = dte.GetActiveDocument() |> liftMaybe
  +                let! project = ProjectProvider.createForDocument doc |> liftMaybe
  +                let! newWord, symbol = vsLanguageService.GetSymbol(point, project) |> liftMaybe
  +                match symbol.Kind with
  +                | SymbolKind.Ident ->
  +                    let! interfaceState = queryInterfaceState point doc project
  +                    let! (fsSymbolUse, results) = 
  +                        vsLanguageService.GetFSharpSymbolUse (newWord, symbol, doc.FullName, project, AllowStaleResults.MatchingSource)
  +                    // Recheck cursor position to ensure it's still in new word
  +                    let! point = buffer.GetSnapshotPoint view.Caret.Position |> liftMaybe
  +                    return!
  +                       (match fsSymbolUse.Symbol with
  +                        | :? FSharpEntity as entity when point.InSpan newWord ->
  +                            // The entity might correspond to another symbol so we check for symbol text and start ranges as well
  +                            if InterfaceStubGenerator.isInterface entity && entity.DisplayName = symbol.Text 
  +                                && hasSameStartPos fsSymbolUse.RangeAlternate interfaceState.InterfaceData.Range then
  +                                Some (newWord, (interfaceState, fsSymbolUse.DisplayContext, entity, results))
  +                            else None
  +                        | _ -> None) |> liftMaybe
  +                | _ -> return! liftMaybe None
           }
  -        |> Async.map (fun res -> 
  +        |> Async.map (fun result -> 
               let changed =
  -                match state, res with
  -                | None, None -> false
  +                match state, result, currentWord with
  +                | None, None, _ -> false
  +                | _, Some (newWord, _), Some oldWord -> newWord <> oldWord
                   | _ -> true
  -            state <- res
  +            state <- result
               if changed then
                   let span = SnapshotSpan(buffer.CurrentSnapshot, 0, buffer.CurrentSnapshot.Length)
                   tagsChanged.Trigger(self, SnapshotSpanEventArgs(span)))
  
positive.code:     let shouldImplementInterface _interfaceState (entity: FSharpEntity) =
          not (InterfaceStubGenerator.hasNoInterfaceMember entity)
  
      let handleImplementInterface (span: SnapshotSpan) state displayContext implementedMemberSignatures entity = 
          let editorOptions = editorOptionsFactory.GetOptions(buffer)
          let indentSize = editorOptions.GetOptionValue((IndentSize()).Key)
          let startColumn = inferStartColumn indentSize state
  
negative.code:                     async {
                          let getMemberByLocation(name, range: range) =
                              let lineStr = 
                                  match fromFSharpPos snapshot range with
                                  | Some span -> span.End.GetContainingLine().GetText()
                                  | None -> String.Empty
                              results.GetSymbolUseAtLocation(range.EndLine, range.EndColumn, lineStr, [name])
                          let! implementedMemberSignatures = InterfaceStubGenerator.getImplementedMemberSignatures 
                                                                 getMemberByLocation displayContext state.InterfaceData
                          return handleImplementInterface snapshot state displayContext implementedMemberSignatures entity
                      }
                      |> Async.StartImmediate
                  else
                      let statusBar = serviceProvider.GetService<IVsStatusbar, SVsStatusbar>()
                      statusBar.SetText(Resource.interfaceEmptyStatusMessage) |> ignore }
  
      member x.GetSmartTagActions(snapshot, interfaceDefinition) =
          let actionSetList = ResizeArray<SmartTagActionSet>()
          let actionList = ResizeArray<ISmartTagAction>()
  
          actionList.Add(implementInterface snapshot interfaceDefinition)
          let actionSet = SmartTagActionSet(actionList.AsReadOnly())
          actionSetList.Add(actionSet)
          actionSetList.AsReadOnly()
  