       }
 
       // All resources within packageMatches were sourced from the current package.
-      // Time to set migrate these.
-
-      // TODO:  Migrate 'em based on their source packages.
+      // Time to set migrate these.  Overwrites any obstructing files with the
+      // the decompressed KMP's contents.
+      do {
+        // We've already parsed the metadata, but now we need to have the files ready for install.
+        let package = try ResourceFileManager.shared.prepareKMPInstall(from: kmpFile) as! Package
+        try packageMatches.forEach { resource in
+          try ResourceFileManager.shared.install(resourceWithID: resource.typedFullID, from: package)
+        }
+        // Post-install cleanup.
+        try FileManager.default.removeItem(at: package.sourceFolder)
+      } catch {
+        log.error("Could not install resource from locally-cached package: \(String(describing: error))")
+      }
 
       matched.append(contentsOf: packageMatches)
     }

    //          then migrate by reinstalling the KMP.
    var matched: [Resource] = []

    localPackages.forEach { package in
      let packageMatches: [Resource] = resources.compactMap { resource in
        if let possibleMatch = package.findResource(withID: resource.typedFullID) {
          if possibleMatch.version == resource.version {

        _ resources: [Resource]) -> [Resource]
        where Resource: KMPInitializableLanguageResource,
              Resource == Resource.Metadata.LanguageResourceType {
    // Step 1 - drop version numbers from all filenames.  KMP installations don't include them, and
    // the version numbered filenames will actually interfere with migration.
    resources.forEach { resource in
      let srcLocation = Storage.active.legacyResourceURL(for: resource)!
      let dstLocation = Storage.active.resourceURL(for: resource)!

      do {
        if FileManager.default.fileExists(atPath: srcLocation.path) {
          try FileManager.default.moveItem(at: srcLocation, to: dstLocation)
        }
      } catch {
        log.error("Could not remove version number from filename for resource \(resource.packageID ?? "<no package>").\(resource.id)")
        log.error("Source: \(srcLocation)")
      }
    }

    // Step 2 - analyze all locally-cached KMPs for possible resource sources.
    var allLocalPackages: [(KeymanPackage, URL)] = []
    do {
      let cachedKMPsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
      let files = try FileManager.default.contentsOfDirectory(atPath: cachedKMPsDirectory.path)
