anchor.diff:      inherit CompletionProvider()
   
       static let userOpName = "CompletionProvider"
  -    // Save the backing data in a memory cache held in a sliding window
  -    static let declarationItemsCache = new MemoryCache("FSharp.Editor." + userOpName)
  +    // Save the backing data in a cache, we need to save for at least the length of the completion session
  +    // See https://github.com/Microsoft/visualfsharp/issues/4714
  +    static let declarationItemsData = new ConcurrentDictionary<string, FSharpDeclarationListItem>()
       static let [<Literal>] NameInCodePropName = "NameInCode"
       static let [<Literal>] FullNamePropName = "FullName"
       static let [<Literal>] IsExtensionMemberPropName = "IsExtensionMember"
  
positive.code:             let! results = 
                  FSharpCompletionProvider.ProvideCompletionsAsyncAux(checker, sourceText, context.Position, projectOptions, 
                                                                      document.FilePath, textVersion.GetHashCode(), getAllSymbols)
              context.AddItems(results)
          } |> Async.Ignore |> RoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
          
      override this.GetDescriptionAsync(_: Document, completionItem: Completion.CompletionItem, cancellationToken: CancellationToken): Task<CompletionDescription> =
          async {
              match declarationItemsCache.Get(completionItem.DisplayText) with
              | :? FSharpDeclarationListItem as declarationItem -> 
                  let! description = declarationItem.StructuredDescriptionTextAsync
                  let documentation = List()
                  let collector = RoslynHelpers.CollectTaggedText documentation
  
negative.code: open Microsoft.FSharp.Compiler.Range
  open Microsoft.FSharp.Compiler.SourceCodeServices
  open System.Runtime.Caching
  open System.Collections.Concurrent
  
  type internal FSharpCompletionProvider
      (
  