 /// already exist.
 ///
 /// Returns a signal that will send the URL after copying upon success.
-private func copyBuildProductIntoDirectory(directoryURL: NSURL, settings: Dictionary<String, String>) -> ColdSignal<NSURL> {
+private func copyBuildProductIntoDirectory(directoryURL: NSURL, settings: BuildSettings) -> ColdSignal<NSURL> {
 	return ColdSignal.lazy {
 		var error: NSError?
 		if !NSFileManager.defaultManager().createDirectoryAtURL(directoryURL, withIntermediateDirectories: true, attributes: nil, error: &error) {
 			return .error(error ?? CarthageError.WriteFailed(directoryURL).error)
 		}
 
-		return valueForBuildSetting("WRAPPER_NAME", settings)
+		return ColdSignal.fromResult(settings.wrapperName)
 			.map(directoryURL.URLByAppendingPathComponent)
 			.map { destinationURL in
-				return URLToBuiltProduct(settings)
+				return ColdSignal.fromResult(settings.wrapperURL)
 					.try { (productURL, error) in
 						// TODO: Atomic copying.
 						NSFileManager.defaultManager().removeItemAtURL(destinationURL, error: nil)


						return copyBuildProductIntoDirectory(folderURL, deviceSettings)
							.map { productURL in
								let mergeProductBinaries = URLToBuiltExecutable(simulatorSettings)
									.concat(URLToBuiltExecutable(deviceSettings))
									.reduce(initial: []) { $0 + [ $1 ] }
									// TODO: This should be a zip.
									.combineLatestWith(valueForBuildSetting("EXECUTABLE_PATH", deviceSettings).map(folderURL.URLByAppendingPathComponent))
									.map { (executableURLs: [NSURL], outputURL: NSURL) -> ColdSignal<()> in
										return mergeExecutables(executableURLs, outputURL)
									}
									.merge(identity)

								let sourceModulesURL = pathToModulesFolder(simulatorSettings)
									// TODO: This should be a zip.
									.combineLatestWith(URLToBuildProductsDirectory(simulatorSettings))
									.map { (modulesPath, productsURL) -> NSURL in
										return productsURL.URLByAppendingPathComponent(modulesPath)
									}

								let destinationModulesURL = pathToModulesFolder(deviceSettings)
									.map { modulesPath -> NSURL in
										return folderURL.URLByAppendingPathComponent(modulesPath)
									}

								let mergeProductModules = sourceModulesURL

private func shouldBuildScheme(buildArguments: BuildArguments) -> ColdSignal<Bool> {
	precondition(buildArguments.scheme != nil)

	return BuildSettings.loadWithArguments(buildArguments)
		.tryMap { settings in settings.productType }
		.map { type in
			switch type {
			case let .Framework:
