anchor.diff:          add_solution_component proxy sol_id resp.EntityMetadata.MetadataId.Value 1
         else if dev_ent.OuterXml = prod_ent.OuterXml then
           if output = Same || output = Both then 
  -          printfn "Removing unchanged entity: %s" name;
  +          log.Verbose "Removing unchanged entity: %s" name;
           remove_node dev_ent;
         else
  -        printfn "Processing entity: %s" name;
  +        log.Verbose "Processing entity: %s" name;
           let req = RetrieveEntityRequest ()
           req.EntityFilters <- EntityFilters.All;
           req.LogicalName <- name.ToLower();
  
positive.code:     download env file_location sol_name minutes
  
  let unzip file =
    printfn "Unpacking zip '%s' to '%s'" (file + ".zip") file;
    if Directory.Exists(file) then
      Directory.Delete(file, true) |> ignore;
    ZipFile.ExtractToDirectory(file + ".zip", file);
  
  let fetch_solution proxy (solution: string) = 
    let columnSet = ColumnSet("uniquename", "friendlyname", "publisherid", "version")
    CrmDataInternal.Entities.retrieveSolution proxy solution columnSet
  
  let create_solution (proxy: IOrganizationService) temporary_solution_name publisher = 
    printfn "Creating solution '%s'" temporary_solution_name;
    let upd = Entity ("solution")
    upd.Attributes.["uniquename"] <- temporary_solution_name;
    upd.Attributes.["friendlyname"] <- "Temporary. For deploy";
  
negative.code: 
    publish proxy;
    stopWatch.Stop()
    log.Info "Downtime: %.1f minutes" stopWatch.Elapsed.TotalMinutes;
    transfer_solution_components proxy sol.Id complete_solution_name
    // Delete [partial solution] on TARGET
    log.Verbose "Deleting solution '%s'" temporary_solution_name;
    proxy.Delete("solution", sol.Id);
      