anchor.diff:  3. Lists of the type of tasks that were created with the old API. This is a good list to work down to increase the amount of possible avoidable task configuration. 
   4. Lists of the type of tasks that were created with the new API but were created/configured anyways. This is a good list to work down to increase the amount of task configuration that is avoided.
   
  -These statistics are printed out once per build. So projects with buildSrc will display this information twice (once for buildSrc, once for the root build).  In a build that uses the new APIs perfectly, we should see 0 tasks created with the old API and only 1 created/configured task because we are only executing the `help` task. If you run other tasks (like `build`), you should expect many more tasks to be created and configured.
  +These statistics are printed out once per build. Projects with buildSrc and composite builds will display this information multiple times. In a build that uses the new APIs perfectly, we should see 0 tasks created with the old API and only 1 created/configured task because we are only executing the `help` task. If you run other tasks (like `build`), you should expect many more tasks to be created and configured.
   
   You can use the list of task types to guide which tasks would provide the biggest bang for your buck when you migrate to the new API.
   
   To approximate the time it takes to configure a build without executing tasks, you can run `gradle help`. Please use the Gradle Profiler to measure your build as described in <<sec:new_task_gradle_profiler_scenario>>.
   
   [[sec:task_configuration_avoidance_pitfalls]]
  -==== Pitfalls and examples
  +==== Pitfalls and Migration guidelines
   
   The following guidelines should be followed when using the new APIs:
   
  
positive.code: 
  [cols="a,a", options="header"]
  |===
  | Old API | New API
  
  | *Groovy DSL* `task myTask(type: MyTask) {}`
  | `tasks.register("myTask", MyTask) {}`
  2+| There is not a shorthand DSL for using the new API.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.util.Map)[]
  | No direct equivalent.
  2+| Use one of the alternatives below.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.util.Map,groovy.lang.Closure)[]
  | No direct equivalent.
  2+| Use one of the alternatives below.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.lang.String)[]
  | api:org.gradle.api.tasks.TaskContainer#register(java.lang.String)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.lang.String,groovy.lang.Closure)[]
  | api:org.gradle.api.tasks.TaskContainer#register(java.lang.String,org.gradle.api.Action)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.lang.String,java.lang.Class)[]
  | api:org.gradle.api.tasks.TaskContainer#register(java.lang.String,java.lang.Class)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.lang.String,java.lang.Class,org.gradle.api.Action)[]
  | api:org.gradle.api.tasks.TaskContainer#register(java.lang.String,java.lang.Class,org.gradle.api.Action)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskContainer#create(java.lang.String,java.lang.Class,java.lang.Object...)[]
  | api:org.gradle.api.tasks.TaskContainer#register(java.lang.String,java.lang.Class,java.lang.Object...)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskCollection#getByName(java.lang.String)[]
  | api:org.gradle.api.tasks.TaskCollection#named(java.lang.String)[]
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.tasks.TaskCollection#getByName(java.lang.String,groovy.lang.Closure)[]
  | `named(java.lang.String).configure(Action)`
  2+| This returns `void`, so it cannot be chained.
  
  | api:org.gradle.api.tasks.TaskContainer#getByPath(java.lang.String)[]
  | No direct equivalent.
  2+| Accessing tasks from another project requires a specific ordering of project evaluation. 
  
  | api:org.gradle.api.NamedDomainObjectCollection#findByName(java.lang.String)[]
  | No direct equivalent.
  2+| `named(String)` is the closest equivalent, but will fail if the task does not exist. Using `findByName(String)` will cause tasks registered with the new API to be created/configured.
  
  | api:org.gradle.api.tasks.TaskContainer#findByPath(java.lang.String)[]
  | No direct equivalent.
  2+| See `getByPath(String)` above.
  
  | api:org.gradle.api.tasks.TaskCollection#withType(java.lang.Class)[]
  | _OK_
  2+| This is OK to use because it does not require tasks to be created immediately.
  
  | `withType(java.lang.Class).getByName(java.lang.String)`
  | `withType(java.lang.Class).named(java.lang.String)`
  2+| This returns a `TaskProvider` instead of a `Task`.
  
  | api:org.gradle.api.DomainObjectCollection#withType(java.lang.Class,org.gradle.api.Action)[]
  | `withType(java.lang.Class).configureEach(org.gradle.api.Action)`
  2+| This returns `void`, so it cannot be chained.
  
  | api:org.gradle.api.DomainObjectCollection#all(org.gradle.api.Action)[]
  | api:org.gradle.api.DomainObjectCollection#configureEach(org.gradle.api.Action)[]
  2+| This returns `void`, so it cannot be chained.
  
  | api:org.gradle.api.NamedDomainObjectSet#findAll(groovy.lang.Closure)[]
  | _OK_, with issues.
  2+| Avoid calling this method. `matching(Spec)` and `configureEach(Action)` are more appropriate in most cases.
  
  | api:org.gradle.api.tasks.TaskCollection#matching(groovy.lang.Closure)[]
  | _OK_
  2+| This is OK to use because it does not require tasks to be created immediately.
  
  | api:org.gradle.api.tasks.TaskCollection#getAt(java.lang.String)[]
  | api:org.gradle.api.tasks.TaskCollection#named(java.lang.String)[]
  2+| Avoid calling this directly as it's a Groovy convenience method. The alternative returns a `TaskProvider` instead of a `Task`.
  
  | `iterator()` or implicit iteration over the `Task` collection
  | _OK_, with issues.
  2+| Avoid doing this as it requires creating and configuring all tasks. See `findAll(Closure)` above.
  
  | `remove(org.gradle.api.Task)`
  | _OK_, with issues.
  2+| Avoid calling this. The behavior of `remove` with the new API may change in the future.
  
  | api:org.gradle.api.tasks.TaskContainer#replace(java.lang.String)[]
  | _OK_, with issues.
  2+| Avoid calling this. The behavior of `replace` with the new API may change in the future.
  
  | api:org.gradle.api.tasks.TaskContainer#replace(java.lang.String,java.lang.Class)[]
  | _OK_, with issues.
  2+| Avoid calling this. The behavior of `replace` with the new API may change in the future.
  
  |===
  
  
negative.code: [[sec:how_do_i_defer_configuration]]
  ==== How do I defer task configuration?
  
  Existing APIs like api:org.gradle.api.DomainObjectCollection#all(org.gradle.api.Action)[] and api:org.gradle.api.DomainObjectCollection#withType(java.lang.Class,org.gradle.api.Action)[] will immediately create and configure any registered tasks. To defer task configuration, you will need to migrate to a new API equivalent. See the <<sec:old_vs_new_configuration_api_overview,table below>> to identify the new API alternative.
  
  [[sec:how_do_i_reference_a_task]]
  ==== How do I reference a task without creating/configuring it?
  