public static async Task<bool> RestoreMissingPackages(NuGetPackageManager nuGetPackageManager,
            IEnumerable<PackageReference> packageReferences,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token,
            EventHandler<PackageRestoredEventArgs> packageRestoredEvent = null,
            IEnumerable<SourceRepository> sourceRepositories = null)
        {
            if(nuGetPackageManager == null)
            {
                throw new ArgumentNullException("nuGetPackageManager");
            }

            if(packageReferences == null)
            {
                throw new ArgumentNullException("packageReferences");
            }

            if(nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            if (!packageReferences.Any())
                return false;

            var hashSetOfMissingPackageReferences = new HashSet<PackageReference>(packageReferences, new PackageReferenceComparer()); 

            // Before starting to restore package, set the nuGetProjectContext such that satellite files are not copied yet
            // Satellite files will be copied as a post operation. This helps restore packages in parallel
            // and not have to determine if the package is a satellite package beforehand

            if(nuGetProjectContext.PackageExtractionContext == null)
            {
                nuGetProjectContext.PackageExtractionContext = new PackageExtractionContext();
            }
            nuGetProjectContext.PackageExtractionContext.CopySatelliteFiles = false;

            token.ThrowIfCancellationRequested();
            // TODO: Update this to use the locked version
            bool[] results = await Task.WhenAll(hashSetOfMissingPackageReferences.Select(uniqueMissingPackage =>
                RestorePackageAsync(nuGetPackageManager, uniqueMissingPackage.PackageIdentity, nuGetProjectContext,
                packageRestoredEvent, sourceRepositories, token)));

            token.ThrowIfCancellationRequested();
            bool[] satelliteFileResults = await Task.WhenAll(hashSetOfMissingPackageReferences.Select(uniqueMissingPackage =>
                nuGetPackageManager.CopySatelliteFilesAsync(uniqueMissingPackage.PackageIdentity, nuGetProjectContext, token)));

            return results.Any() || satelliteFileResults.Any();
        }