anchor.diff:          | Entity(Enum as e, _, _) when not e.IsFSharp -> false
           | _ -> true
   
  -    // Implementation location points to fsi files for out-of-solution symbols
  -    // In that case, we create fake locations in the implementation files
  -    let tryGetImplementationLocation (fsSymbol: FSharpSymbol) =
  -        fsSymbol.ImplementationLocation
  -        |> Option.map (fun range ->
  -            if range.FileName.EndsWith(".fsi", StringComparison.OrdinalIgnoreCase) then
  -                let implFileName = Path.ChangeExtension(range.FileName, ".fs")
  -                mkRange implFileName (mkPos 1 0) (mkPos 1 0)
  -            else range)
  -
  -    let navigateToSource (fsSymbol: FSharpSymbol) (symbolCache: SymbolCache)(url: string) = 
  -        match symbolCache.DownloadFile url with
  -        | null ->
  -            let statusBar = serviceProvider.GetService<IVsStatusbar, SVsStatusbar>()
  -            statusBar.SetText(sprintf "The url '%s' is invalid and can't be downloaded." url) |> ignore
  -        | filePath ->
  -            tryGetImplementationLocation fsSymbol
  -            |> Option.iter (fun r -> 
  -                serviceProvider.NavigateTo(filePath, r.StartLine-1, r.StartColumn, r.EndLine-1, r.EndColumn))
  +    let replace (b:string) c (a:string) = a.Replace(b, c)
  +
  +    let navigateToSource (fsSymbol: FSharpSymbol) (url: string) = 
  +        async {
  +            use handler = new HttpClientHandler(UseDefaultCredentials = true)
  +            use http = new HttpClient(handler)
  +            let! response = http.GetAsync(url) |> Async.AwaitTask
  +            if response.IsSuccessStatusCode then
  +                fsSymbol.ImplementationLocation
  +                |> Option.iter (fun r ->
  +                    // Note: other source code hostings might have different url templating
  +                    let m = Regex.Matches(url, "[0-9a-fA-F]{32}") |> Seq.cast<Match> |> Seq.tryHead
  +                    let replaceBlob (m: Match option) url =
  +                        match m with
  +                        | Some m when m.Success ->
  +                            replace m.Value (sprintf "blob/%s" m.Value) url
  +                        | _ -> url
  +                    let browserUrl =
  +                        sprintf "%s#L%d"
  +                            (url 
  +                             |> replace "raw.githubusercontent" "github" 
  +                             |> replace "raw.github" "github" 
  +                             |> replaceBlob m)
  +                            r.StartLine
  +                    Process.Start(browserUrl) |> ignore)
  +            else
  +                let statusBar = serviceProvider.GetService<IVsStatusbar, SVsStatusbar>()
  +                statusBar.SetText(sprintf "The url '%s' is invalid with error code %A." url response.StatusCode) |> ignore
  +        }
   
       let tryFindSourceUrl (fsSymbol: FSharpSymbol) = 
           fsSymbol.Assembly.FileName
  
positive.code: open SourceLink
  open SourceLink.SymbolStore
  open System.Diagnostics
  
  [<RequireQualifiedAccess>]
  type NavigationPreference =
  
negative.code:                             referenceSourceProvider.NavigateTo symbol
                          else
                              match tryFindSourceUrl symbol with
                              | Some url ->
                                  return! navigateToSource symbol url
                              | None ->
                                  match pref with
                                  | NavigationPreference.SymbolSourceOrMetadata ->
  