| Index: lib/src/entrypoint.dart
 | 
| diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
 | 
| index 0152926be06f375f9d77133da49fd124981d524f..6b763acfd6541eaf4017e33c2e23ab94f05af9f4 100644
 | 
| --- a/lib/src/entrypoint.dart
 | 
| +++ b/lib/src/entrypoint.dart
 | 
| @@ -90,7 +90,7 @@ class Entrypoint {
 | 
|      assertUpToDate();
 | 
|      var packages = new Map.fromIterable(lockFile.packages.values,
 | 
|          key: (id) => id.name,
 | 
| -        value: (id) => cache.sources.load(id));
 | 
| +        value: (id) => cache.load(id));
 | 
|      packages[root.name] = root;
 | 
|  
 | 
|      _packageGraph = new PackageGraph(this, lockFile, packages);
 | 
| @@ -169,7 +169,7 @@ class Entrypoint {
 | 
|    /// Updates [lockFile] and [packageRoot] accordingly.
 | 
|    Future acquireDependencies(SolveType type, {List<String> useLatest,
 | 
|        bool dryRun: false, bool precompile: true}) async {
 | 
| -    var result = await resolveVersions(type, cache.sources, root,
 | 
| +    var result = await resolveVersions(type, cache, root,
 | 
|          lockFile: lockFile, useLatest: useLatest);
 | 
|      if (!result.succeeded) throw result.error;
 | 
|  
 | 
| @@ -217,7 +217,7 @@ class Entrypoint {
 | 
|        log.exception(error, stackTrace);
 | 
|      }
 | 
|  
 | 
| -    writeTextFile(packagesFile, lockFile.packagesFile(root.name));
 | 
| +    writeTextFile(packagesFile, lockFile.packagesFile(cache, root.name));
 | 
|    }
 | 
|  
 | 
|    /// Precompile any transformed dependencies of the entrypoint.
 | 
| @@ -432,7 +432,7 @@ class Entrypoint {
 | 
|    Future _get(PackageId id) async {
 | 
|      if (id.isRoot) return;
 | 
|  
 | 
| -    var source = cache.sources[id.source];
 | 
| +    var source = cache.source(id.source);
 | 
|      if (!_packageSymlinks) {
 | 
|        if (source is CachedSource) await source.downloadToSystemCache(id);
 | 
|        return;
 | 
| @@ -516,11 +516,11 @@ class Entrypoint {
 | 
|      // Check that uncached dependencies' pubspecs are also still satisfied,
 | 
|      // since they're mutable and may have changed since the last get.
 | 
|      for (var id in lockFile.packages.values) {
 | 
| -      var source = cache.sources[id.source];
 | 
| +      var source = cache.source(id.source);
 | 
|        if (source is CachedSource) continue;
 | 
|  
 | 
|        try {
 | 
| -        if (cache.sources.load(id).dependencies.every((dep) =>
 | 
| +        if (cache.load(id).dependencies.every((dep) =>
 | 
|              overrides.contains(dep.name) || _isDependencyUpToDate(dep))) {
 | 
|            continue;
 | 
|          }
 | 
| @@ -561,10 +561,11 @@ class Entrypoint {
 | 
|        // We only care about cached sources. Uncached sources aren't "installed".
 | 
|        // If one of those is missing, we want to show the user the file not
 | 
|        // found error later since installing won't accomplish anything.
 | 
| -      if (source is! CachedSource) return true;
 | 
| +      var boundSource = cache.source(package.source);
 | 
| +      if (boundSource is! CachedSource) return true;
 | 
|  
 | 
|        // Get the directory.
 | 
| -      var dir = source.getDirectory(package);
 | 
| +      var dir = boundSource.getDirectory(package);
 | 
|        // See if the directory is there and looks like a package.
 | 
|        return dirExists(dir) && fileExists(p.join(dir, "pubspec.yaml"));
 | 
|      });
 | 
| @@ -581,13 +582,13 @@ class Entrypoint {
 | 
|          p.toUri(packagesFile));
 | 
|  
 | 
|      return lockFile.packages.values.every((lockFileId) {
 | 
| -      var source = cache.sources[lockFileId.source];
 | 
| +      var source = cache.source(lockFileId.source);
 | 
|  
 | 
|        // It's very unlikely that the lockfile is invalid here, but it's not
 | 
|        // impossible—for example, the user may have a very old application
 | 
|        // package with a checked-in lockfile that's newer than the pubspec, but
 | 
|        // that contains sdk dependencies.
 | 
| -      if (source == null) return false;
 | 
| +      if (source.source is UnknownSource) return false;
 | 
|  
 | 
|        var packagesFileUri = packages[lockFileId.name];
 | 
|        if (packagesFileUri == null) return false;
 | 
| 
 |