Repository: metal3-io/baremetal-operator
Pull request #1015 (2021-11-04 19:09:10)

Doc changes for HostFirmwareSettings and FirmwareSchema resources

metal3-io-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **andfasano** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @andfasano` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=metal3-io%2Fbaremetal-operator).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/metal3-io/baremetal-operator/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["andfasano"]} -->
metal3-io-bot: @bfournie: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`
manifestlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1456337751942107136) | true | `/test manifestlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`
manifestlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1456337751942107136) | true | `/test manifestlint`
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1456337751732391936) | true | `/test markdownlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`
manifestlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1456337751942107136) | true | `/test manifestlint`
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1456337751732391936) | true | `/test markdownlint`
gosec | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1456337751661088768) | true | `/test gosec`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`
manifestlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1456337751942107136) | true | `/test manifestlint`
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1456337751732391936) | true | `/test markdownlint`
gosec | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1456337751661088768) | true | `/test gosec`
unit | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1456337751841443840) | true | `/test unit`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
bfournie: /retest
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
gofmt | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1456337751614951424) | true | `/test gofmt`
golint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1456337751900164096) | true | `/test golint`
gomod | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1456337751665283072) | true | `/test gomod`
generate | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1456337751862415360) | true | `/test generate`
manifestlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1456337751942107136) | true | `/test manifestlint`
gosec | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1456337751661088768) | true | `/test gosec`
unit | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1456337751841443840) | true | `/test unit`
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1456646937821319168) | true | `/test markdownlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
bfournie: /retest
metal3-io-bot: @bfournie: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457826774736965632) | true | `/test markdownlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457826774736965632) | true | `/test markdownlint`
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457826774736965632) | true | `/test markdownlint`
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457826774736965632) | true | `/test markdownlint`
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
markdownlint | 044b85dda20d1b9e62ebcc511231feaa9949e4b4 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457826774736965632) | true | `/test markdownlint`
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`
markdownlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457828119854452736) | true | `/test markdownlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`
markdownlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457828119854452736) | true | `/test markdownlint`
generate | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1457828120127082496) | true | `/test generate`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`
markdownlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457828119854452736) | true | `/test markdownlint`
generate | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1457828120127082496) | true | `/test generate`
gosec | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1457828119695069184) | true | `/test gosec`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457828120353574912) | true | `/test manifestlint`
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`
markdownlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457828119854452736) | true | `/test markdownlint`
generate | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1457828120127082496) | true | `/test generate`
gosec | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1457828119695069184) | true | `/test gosec`
gofmt | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1457828119674097664) | true | `/test gofmt`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
bfournie: /retest
metal3-io-bot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
unit | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/unit/1457828119896395776) | true | `/test unit`
gomod | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gomod/1457828119766372352) | true | `/test gomod`
golint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/golint/1457828120320020480) | true | `/test golint`
markdownlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/markdownlint/1457828119854452736) | true | `/test markdownlint`
generate | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/generate/1457828120127082496) | true | `/test generate`
gosec | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gosec/1457828119695069184) | true | `/test gosec`
gofmt | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/gofmt/1457828119674097664) | true | `/test gofmt`
manifestlint | c97a16418ee241338985670d09909b886f7f6184 | [link](https://prow.apps.test.metal3.io/view/s3/prow-logs/pr-logs/pull/metal3-io_baremetal-operator/1015/manifestlint/1457831418938789888) | true | `/test manifestlint`

[Full PR test history](https://prow.apps.test.metal3.io/pr-history?org=metal3-io&repo=baremetal-operator&pr=1015). [Your PR dashboard](https://prow.apps.test.metal3.io/pr?query=is:pr+state:open+author:bfournie).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
bfournie: /retest manifestlint 
metal3-io-bot: @bfournie: The `/retest` command does not accept any targets.
The following commands are available to trigger required jobs:
* `/test generate`
* `/test gofmt`
* `/test golint`
* `/test gomod`
* `/test gosec`
* `/test manifestlint`
* `/test markdownlint`
* `/test shellcheck`
* `/test unit`

Use `/test all` to run the following jobs that were automatically triggered:
* `generate`
* `gofmt`
* `golint`
* `gomod`
* `gosec`
* `manifestlint`
* `markdownlint`
* `unit`



<details>

In response to [this](https://github.com/metal3-io/baremetal-operator/pull/1015#issuecomment-963638010):

>/retest manifestlint 


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
bfournie: /test manifestlint
hardys: /test test-v1b1-integration
metal3-io-bot: @hardys: The specified target(s) for `/test` were not found.
The following commands are available to trigger required jobs:
* `/test generate`
* `/test gofmt`
* `/test golint`
* `/test gomod`
* `/test gosec`
* `/test manifestlint`
* `/test markdownlint`
* `/test shellcheck`
* `/test unit`

Use `/test all` to run the following jobs that were automatically triggered:
* `generate`
* `gofmt`
* `golint`
* `gomod`
* `gosec`
* `manifestlint`
* `markdownlint`
* `unit`



<details>

In response to [this](https://github.com/metal3-io/baremetal-operator/pull/1015#issuecomment-970307391):

>/test test-v1b1-integration


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
hardys: /test-v1b1-integration

Patch:
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 243f81a5..00000000
--- a/.dockerignore
+++ /dev/null
@@ -1,5 +0,0 @@
-# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file
-# Ignore all files which are not go type
-!**/*.go
-!**/*.mod
-!**/*.sum
diff --git a/.golangci.yml b/.golangci.yml
index 9b2c6d9a..43ee4792 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -4,7 +4,7 @@ run:
 linters:
   disable-all: true
   enable: [
-    "revive",
+    "golint",
     "govet",
     "goimports",
     "gofmt",
diff --git a/Makefile b/Makefile
index 58d5d4ea..8391bab7 100644
--- a/Makefile
+++ b/Makefile
@@ -235,7 +235,5 @@ mod: ## Clean up go module settings
 	go mod verify
 	cd apis; go mod tidy
 	cd apis; go mod verify
-	cd pkg/ironic; go mod tidy
-	cd pkg/ironic; go mod verify
 	cd hack/tools; go mod tidy
 	cd hack/tools; go mod verify
diff --git a/OWNERS b/OWNERS
index 65885238..d9715a52 100644
--- a/OWNERS
+++ b/OWNERS
@@ -6,11 +6,10 @@ approvers:
  - fmuyassarov
  - hardys
  - maelk
+ - stbenjam
  - zaneb
 
 reviewers:
- - ardaguclu
- - bfournie
  - honza
  - dukov
  - furkatgofurov7
diff --git a/PROJECT b/PROJECT
index a76ea4d6..f3e77ea5 100644
--- a/PROJECT
+++ b/PROJECT
@@ -1,47 +1,16 @@
-domain: metal3.io
-layout:
-- go.kubebuilder.io/v3
 multigroup: true
-projectName: baremetal-operator
 repo: github.com/metal3-io/baremetal-operator
 resources:
-- api:
-    crdVersion: v1
-    namespaced: true
-  controller: true
-  domain: metal3.io
-  group: metal3.io
+- group: metal3.io
   kind: BareMetalHost
-  path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
   version: v1alpha1
-  webhooks:
-    validation: true
-    webhookVersion: v1
-- api:
-    crdVersion: v1
-    namespaced: true
-  controller: true
-  domain: metal3.io
-  group: metal3.io
+- group: metal3.io
   kind: HostFirmwareSettings
-  path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
   version: v1alpha1
-- api:
-    crdVersion: v1
-    namespaced: true
-  controller: true
-  domain: metal3.io
-  group: metal3.io
+- group: metal3.io
   kind: FirmwareSchema
-  path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
   version: v1alpha1
-- api:
-    crdVersion: v1
-    namespaced: true
-  controller: true
-  domain: metal3.io
-  group: metal3.io
+- group: metal3.io
   kind: PreprovisioningImage
-  path: github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1
   version: v1alpha1
-version: "3"
+version: "2"
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types.go b/apis/metal3.io/v1alpha1/baremetalhost_types.go
index 433a26f8..371b5ebb 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types.go
@@ -1,5 +1,6 @@
 /*
 
+
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
diff --git a/apis/metal3.io/v1alpha1/groupversion_info.go b/apis/metal3.io/v1alpha1/groupversion_info.go
index eb8116d7..700bd313 100644
--- a/apis/metal3.io/v1alpha1/groupversion_info.go
+++ b/apis/metal3.io/v1alpha1/groupversion_info.go
@@ -1,5 +1,6 @@
 /*
 
+
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
@@ -14,8 +15,8 @@ limitations under the License.
 */
 
 // Package v1alpha1 contains API Schema definitions for the metal3.io v1alpha1 API group
-//+kubebuilder:object:generate=true
-//+groupName=metal3.io
+// +kubebuilder:object:generate=true
+// +groupName=metal3.io
 package v1alpha1
 
 import (
diff --git a/apis/metal3.io/v1alpha1/preprovisioningimage_types.go b/apis/metal3.io/v1alpha1/preprovisioningimage_types.go
index 8853a5e3..84697a94 100644
--- a/apis/metal3.io/v1alpha1/preprovisioningimage_types.go
+++ b/apis/metal3.io/v1alpha1/preprovisioningimage_types.go
@@ -22,8 +22,6 @@ import (
 // +kubebuilder:validation:Enum=iso;initrd
 type ImageFormat string
 
-const PreprovisioningImageFinalizer = "preprovisioningimage.metal3.io"
-
 const (
 	ImageFormatISO    ImageFormat = "iso"
 	ImageFormatInitRD ImageFormat = "initrd"
@@ -39,10 +37,6 @@ type PreprovisioningImageSpec struct {
 	// architecture is the processor architecture for which to build the image.
 	// +optional
 	Architecture string `json:"architecture,omitempty"`
-
-	// acceptFormats is a list of acceptable image formats.
-	// +optional
-	AcceptFormats []ImageFormat `json:"acceptFormats,omitempty"`
 }
 
 type SecretStatus struct {
diff --git a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
index 0891f4ea..44f8b914 100644
--- a/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/metal3.io/v1alpha1/zz_generated.deepcopy.go
@@ -684,7 +684,7 @@ func (in *PreprovisioningImage) DeepCopyInto(out *PreprovisioningImage) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
+	out.Spec = in.Spec
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -741,11 +741,6 @@ func (in *PreprovisioningImageList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PreprovisioningImageSpec) DeepCopyInto(out *PreprovisioningImageSpec) {
 	*out = *in
-	if in.AcceptFormats != nil {
-		in, out := &in.AcceptFormats, &out.AcceptFormats
-		*out = make([]ImageFormat, len(*in))
-		copy(*out, *in)
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreprovisioningImageSpec.
diff --git a/config/crd/bases/metal3.io_preprovisioningimages.yaml b/config/crd/bases/metal3.io_preprovisioningimages.yaml
index 5447d179..180f1f60 100644
--- a/config/crd/bases/metal3.io_preprovisioningimages.yaml
+++ b/config/crd/bases/metal3.io_preprovisioningimages.yaml
@@ -48,15 +48,6 @@ spec:
           spec:
             description: PreprovisioningImageSpec defines the desired state of PreprovisioningImage
             properties:
-              acceptFormats:
-                description: acceptFormats is a list of acceptable image formats.
-                items:
-                  description: ImageFormat enumerates the allowed image formats
-                  enum:
-                  - iso
-                  - initrd
-                  type: string
-                type: array
               architecture:
                 description: architecture is the processor architecture for which
                   to build the image.
diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml
index 9a31c53b..0160d1a9 100644
--- a/config/crd/kustomization.yaml
+++ b/config/crd/kustomization.yaml
@@ -6,7 +6,7 @@ resources:
 - bases/metal3.io_hostfirmwaresettings.yaml
 - bases/metal3.io_firmwareschemas.yaml
 - bases/metal3.io_preprovisioningimages.yaml
-#+kubebuilder:scaffold:crdkustomizeresource
+# +kubebuilder:scaffold:crdkustomizeresource
 
 patchesStrategicMerge:
 # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix.
@@ -15,7 +15,7 @@ patchesStrategicMerge:
 #- patches/webhook_in_hostfirmwaresettings.yaml
 #- patches/webhook_in_firmwareschemas.yaml
 #- patches/webhook_in_preprovisioningimages.yaml
-#+kubebuilder:scaffold:crdkustomizewebhookpatch
+# +kubebuilder:scaffold:crdkustomizewebhookpatch
 
 # [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix.
 # patches here are for enabling the CA injection for each CRD
@@ -23,7 +23,7 @@ patchesStrategicMerge:
 #- patches/cainjection_in_hostfirmwaresettings.yaml
 #- patches/cainjection_in_firmwareschemas.yaml
 #- patches/cainjection_in_preprovisioningimages.yaml
-#+kubebuilder:scaffold:crdkustomizecainjectionpatch
+# +kubebuilder:scaffold:crdkustomizecainjectionpatch
 
 # the following config is for teaching kustomize how to do kustomization for CRDs.
 configurations:
diff --git a/config/crd/kustomizeconfig.yaml b/config/crd/kustomizeconfig.yaml
index ec5c150a..6f83d9a9 100644
--- a/config/crd/kustomizeconfig.yaml
+++ b/config/crd/kustomizeconfig.yaml
@@ -4,15 +4,13 @@ nameReference:
   version: v1
   fieldSpecs:
   - kind: CustomResourceDefinition
-    version: v1
     group: apiextensions.k8s.io
-    path: spec/conversion/webhook/clientConfig/service/name
+    path: spec/conversion/webhookClientConfig/service/name
 
 namespace:
 - kind: CustomResourceDefinition
-  version: v1
   group: apiextensions.k8s.io
-  path: spec/conversion/webhook/clientConfig/service/namespace
+  path: spec/conversion/webhookClientConfig/service/namespace
   create: false
 
 varReference:
diff --git a/config/crd/patches/cainjection_in_baremetalhosts.yaml b/config/crd/patches/cainjection_in_baremetalhosts.yaml
index 74f1a27f..6c3666e7 100644
--- a/config/crd/patches/cainjection_in_baremetalhosts.yaml
+++ b/config/crd/patches/cainjection_in_baremetalhosts.yaml
@@ -1,4 +1,5 @@
 # The following patch adds a directive for certmanager to inject CA into the CRD
+# CRD conversion requires k8s 1.13 or later.
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
diff --git a/config/crd/patches/webhook_in_baremetalhosts.yaml b/config/crd/patches/webhook_in_baremetalhosts.yaml
index fdf4a74e..d99d8f13 100644
--- a/config/crd/patches/webhook_in_baremetalhosts.yaml
+++ b/config/crd/patches/webhook_in_baremetalhosts.yaml
@@ -1,4 +1,5 @@
-# The following patch enables a conversion webhook for the CRD
+# The following patch enables conversion webhook for CRD
+# CRD conversion requires k8s 1.13 or later.
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
@@ -6,12 +7,11 @@ metadata:
 spec:
   conversion:
     strategy: Webhook
-    webhook:
-      clientConfig:
-        service:
-          namespace: system
-          name: webhook-service
-          path: /convert
-        caBundle: Cg==
-      conversionReviewVersions:
-      - v1
+    webhookClientConfig:
+      # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank,
+      # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager)
+      caBundle: Cg==
+      service:
+        namespace: system
+        name: webhook-service
+        path: /convert
diff --git a/config/crd/patches/webhook_in_firmwareschemas.yaml b/config/crd/patches/webhook_in_firmwareschemas.yaml
index e221c848..2744739c 100644
--- a/config/crd/patches/webhook_in_firmwareschemas.yaml
+++ b/config/crd/patches/webhook_in_firmwareschemas.yaml
@@ -7,12 +7,11 @@ metadata:
 spec:
   conversion:
     strategy: Webhook
-    webhook:
-      clientConfig:
-        service:      
-          namespace: system
-          name: webhook-service
-          path: /convert
-        caBundle: Cg==
-      conversionReviewVersions:
-      - v1
+    webhookClientConfig:
+      # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank,
+      # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager)
+      caBundle: Cg==
+      service:
+        namespace: system
+        name: webhook-service
+        path: /convert
diff --git a/config/crd/patches/webhook_in_hostfirmwaresettings.yaml b/config/crd/patches/webhook_in_hostfirmwaresettings.yaml
index 24da15b8..73870848 100644
--- a/config/crd/patches/webhook_in_hostfirmwaresettings.yaml
+++ b/config/crd/patches/webhook_in_hostfirmwaresettings.yaml
@@ -7,13 +7,11 @@ metadata:
 spec:
   conversion:
     strategy: Webhook
-    webhook:
-      clientConfig:
-        service:
-          namespace: system
-          name: webhook-service
-          path: /convert
-        caBundle: Cg==
-      conversionReviewVersions:
-      - v1
-      
+    webhookClientConfig:
+      # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank,
+      # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager)
+      caBundle: Cg==
+      service:
+        namespace: system
+        name: webhook-service
+        path: /convert
diff --git a/config/crd/patches/webhook_in_preprovisioningimages.yaml b/config/crd/patches/webhook_in_preprovisioningimages.yaml
index 33a66ce7..2773ae6f 100644
--- a/config/crd/patches/webhook_in_preprovisioningimages.yaml
+++ b/config/crd/patches/webhook_in_preprovisioningimages.yaml
@@ -7,12 +7,11 @@ metadata:
 spec:
   conversion:
     strategy: Webhook
-    webhook:
-      clientConfig:
-        service:
-          namespace: system
-          name: webhook-service
-          path: /convert
-        caBundle: Cg==
-      conversionReviewVersions:
-      - v1
+    webhookClientConfig:
+      # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank,
+      # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager)
+      caBundle: Cg==
+      service:
+        namespace: system
+        name: webhook-service
+        path: /convert
diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml
index 2e88f2fa..c151099e 100644
--- a/config/default/kustomization.yaml
+++ b/config/default/kustomization.yaml
@@ -16,25 +16,21 @@ bases:
 - ../crd
 - ../rbac
 - ../manager
-# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
+# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in 
 # crd/kustomization.yaml
 - ../webhook
 # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required.
 - ../certmanager
-# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'.
+# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. 
 #- ../prometheus
 
 patchesStrategicMerge:
-# Protect the /metrics endpoint by putting it behind auth.
-# If you want your controller-manager to expose the /metrics
-# endpoint w/o any authn/z, please comment the following line.
+  # Protect the /metrics endpoint by putting it behind auth.
+  # If you want your controller-manager to expose the /metrics
+  # endpoint w/o any authn/z, please comment the following line.
 - manager_auth_proxy_patch.yaml
 
-# Mount the controller config file for loading manager configurations
-# through a ComponentConfig type
-#- manager_config_patch.yaml
-
-# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
+# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in 
 # crd/kustomization.yaml
 - manager_webhook_patch.yaml
 
diff --git a/config/default/manager_auth_proxy_patch.yaml b/config/default/manager_auth_proxy_patch.yaml
index 9ace727e..4161fd4c 100644
--- a/config/default/manager_auth_proxy_patch.yaml
+++ b/config/default/manager_auth_proxy_patch.yaml
@@ -1,4 +1,4 @@
-# This patch inject a sidecar container which is a HTTP proxy for the
+# This patch inject a sidecar container which is a HTTP proxy for the 
 # controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.
 apiVersion: apps/v1
 kind: Deployment
diff --git a/config/default/manager_config_patch.yaml b/config/default/manager_config_patch.yaml
deleted file mode 100644
index 6c400155..00000000
--- a/config/default/manager_config_patch.yaml
+++ /dev/null
@@ -1,20 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: controller-manager
-  namespace: system
-spec:
-  template:
-    spec:
-      containers:
-      - name: manager
-        args:
-        - "--config=controller_manager_config.yaml"
-        volumeMounts:
-        - name: manager-config
-          mountPath: /controller_manager_config.yaml
-          subPath: controller_manager_config.yaml
-      volumes:
-      - name: manager-config
-        configMap:
-          name: manager-config
diff --git a/config/manager/controller_manager_config.yaml b/config/manager/controller_manager_config.yaml
deleted file mode 100644
index 43be9366..00000000
--- a/config/manager/controller_manager_config.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
-kind: ControllerManagerConfig
-health:
-  healthProbeBindAddress: :9440
-metrics:
-  bindAddress: 127.0.0.1:8085
-webhook:
-  port: 9443
-leaderElection:
-  leaderElect: true
-  resourceName: a9498140.metal3.io
diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml
index 2bcd3eea..5c5f0b84 100644
--- a/config/manager/kustomization.yaml
+++ b/config/manager/kustomization.yaml
@@ -1,10 +1,2 @@
 resources:
 - manager.yaml
-
-generatorOptions:
-  disableNameSuffixHash: true
-
-configMapGenerator:
-- name: manager-config
-  files:
-  - controller_manager_config.yaml
diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml
index ea2c7fdf..cff809b2 100644
--- a/config/manager/manager.yaml
+++ b/config/manager/manager.yaml
@@ -37,25 +37,10 @@ spec:
           - configMapRef:
               name: ironic
         name: manager
-        securityContext:
-          allowPrivilegeEscalation: false
         livenessProbe:
           httpGet:
             path: /healthz
             port: 9440
-          initialDelaySeconds: 10
-          periodSeconds: 10
-          timeoutSeconds: 2
-          successThreshold: 1
-          failureThreshold: 10
-        readinessProbe:
-          httpGet:
-            path: /readyz
-            port: 9440
-          initialDelaySeconds: 10
-          periodSeconds: 10
-          timeoutSeconds: 2
-          successThreshold: 1
-          failureThreshold: 10
-      serviceAccountName: controller-manager
+          initialDelaySeconds: 3
+          periodSeconds: 3
       terminationGracePeriodSeconds: 10
diff --git a/config/prometheus/monitor.yaml b/config/prometheus/monitor.yaml
index d19136ae..9b8047b7 100644
--- a/config/prometheus/monitor.yaml
+++ b/config/prometheus/monitor.yaml
@@ -11,10 +11,6 @@ spec:
   endpoints:
     - path: /metrics
       port: https
-      scheme: https
-      bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
-      tlsConfig:
-        insecureSkipVerify: true
   selector:
     matchLabels:
       control-plane: controller-manager
diff --git a/config/rbac/auth_proxy_client_clusterrole.yaml b/config/rbac/auth_proxy_client_clusterrole.yaml
index 51a75db4..bd4af137 100644
--- a/config/rbac/auth_proxy_client_clusterrole.yaml
+++ b/config/rbac/auth_proxy_client_clusterrole.yaml
@@ -3,7 +3,5 @@ kind: ClusterRole
 metadata:
   name: metrics-reader
 rules:
-- nonResourceURLs:
-  - "/metrics"
-  verbs:
-  - get
+- nonResourceURLs: ["/metrics"]
+  verbs: ["get"]
diff --git a/config/rbac/auth_proxy_role.yaml b/config/rbac/auth_proxy_role.yaml
index 80e1857c..618f5e41 100644
--- a/config/rbac/auth_proxy_role.yaml
+++ b/config/rbac/auth_proxy_role.yaml
@@ -3,15 +3,11 @@ kind: ClusterRole
 metadata:
   name: proxy-role
 rules:
-- apiGroups:
-  - authentication.k8s.io
+- apiGroups: ["authentication.k8s.io"]
   resources:
   - tokenreviews
-  verbs:
-  - create
-- apiGroups:
-  - authorization.k8s.io
+  verbs: ["create"]
+- apiGroups: ["authorization.k8s.io"]
   resources:
   - subjectaccessreviews
-  verbs:
-  - create
+  verbs: ["create"]
diff --git a/config/rbac/auth_proxy_role_binding.yaml b/config/rbac/auth_proxy_role_binding.yaml
index ec7acc0a..48ed1e4b 100644
--- a/config/rbac/auth_proxy_role_binding.yaml
+++ b/config/rbac/auth_proxy_role_binding.yaml
@@ -8,5 +8,5 @@ roleRef:
   name: proxy-role
 subjects:
 - kind: ServiceAccount
-  name: controller-manager
+  name: default
   namespace: system
diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml
index 731832a6..66c28338 100644
--- a/config/rbac/kustomization.yaml
+++ b/config/rbac/kustomization.yaml
@@ -1,10 +1,4 @@
 resources:
-# All RBAC will be applied under this service account in
-# the deployment namespace. You may comment out this resource
-# if your manager will use a service account that exists at
-# runtime. Be sure to update RoleBinding and ClusterRoleBinding
-# subjects if changing service account names.
-- service_account.yaml
 - role.yaml
 - role_binding.yaml
 - leader_election_role.yaml
diff --git a/config/rbac/leader_election_role_binding.yaml b/config/rbac/leader_election_role_binding.yaml
index 1d1321ed..eed16906 100644
--- a/config/rbac/leader_election_role_binding.yaml
+++ b/config/rbac/leader_election_role_binding.yaml
@@ -8,5 +8,5 @@ roleRef:
   name: leader-election-role
 subjects:
 - kind: ServiceAccount
-  name: controller-manager
+  name: default
   namespace: system
diff --git a/config/rbac/role_binding.yaml b/config/rbac/role_binding.yaml
index 2070ede4..8f265870 100644
--- a/config/rbac/role_binding.yaml
+++ b/config/rbac/role_binding.yaml
@@ -8,5 +8,5 @@ roleRef:
   name: manager-role
 subjects:
 - kind: ServiceAccount
-  name: controller-manager
+  name: default
   namespace: system
diff --git a/config/rbac/service_account.yaml b/config/rbac/service_account.yaml
deleted file mode 100644
index 7cd6025b..00000000
--- a/config/rbac/service_account.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: controller-manager
-  namespace: system
diff --git a/config/render/capm3.yaml b/config/render/capm3.yaml
index 1b7f2199..7c994b33 100644
--- a/config/render/capm3.yaml
+++ b/config/render/capm3.yaml
@@ -1413,15 +1413,6 @@ spec:
           spec:
             description: PreprovisioningImageSpec defines the desired state of PreprovisioningImage
             properties:
-              acceptFormats:
-                description: acceptFormats is a list of acceptable image formats.
-                items:
-                  description: ImageFormat enumerates the allowed image formats
-                  enum:
-                  - iso
-                  - initrd
-                  type: string
-                type: array
               architecture:
                 description: architecture is the processor architecture for which
                   to build the image.
@@ -1545,12 +1536,6 @@ status:
   conditions: []
   storedVersions: []
 ---
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: baremetal-operator-controller-manager
-  namespace: baremetal-operator-system
----
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
@@ -1742,7 +1727,7 @@ roleRef:
   name: baremetal-operator-leader-election-role
 subjects:
 - kind: ServiceAccount
-  name: baremetal-operator-controller-manager
+  name: default
   namespace: baremetal-operator-system
 ---
 apiVersion: rbac.authorization.k8s.io/v1
@@ -1755,7 +1740,7 @@ roleRef:
   name: baremetal-operator-manager-role
 subjects:
 - kind: ServiceAccount
-  name: baremetal-operator-controller-manager
+  name: default
   namespace: baremetal-operator-system
 ---
 apiVersion: rbac.authorization.k8s.io/v1
@@ -1768,7 +1753,7 @@ roleRef:
   name: baremetal-operator-proxy-role
 subjects:
 - kind: ServiceAccount
-  name: baremetal-operator-controller-manager
+  name: default
   namespace: baremetal-operator-system
 ---
 apiVersion: v1
@@ -1788,25 +1773,6 @@ metadata:
   namespace: baremetal-operator-system
 ---
 apiVersion: v1
-data:
-  controller_manager_config.yaml: |
-    apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
-    kind: ControllerManagerConfig
-    health:
-      healthProbeBindAddress: :9440
-    metrics:
-      bindAddress: 127.0.0.1:8085
-    webhook:
-      port: 9443
-    leaderElection:
-      leaderElect: true
-      resourceName: a9498140.metal3.io
-kind: ConfigMap
-metadata:
-  name: baremetal-operator-manager-config
-  namespace: baremetal-operator-system
----
-apiVersion: v1
 kind: Service
 metadata:
   labels:
@@ -1884,35 +1850,20 @@ spec:
         image: quay.io/metal3-io/baremetal-operator
         imagePullPolicy: Always
         livenessProbe:
-          failureThreshold: 10
           httpGet:
             path: /healthz
             port: 9440
-          initialDelaySeconds: 10
-          periodSeconds: 10
-          successThreshold: 1
-          timeoutSeconds: 2
+          initialDelaySeconds: 3
+          periodSeconds: 3
         name: manager
         ports:
         - containerPort: 9443
           name: webhook-server
           protocol: TCP
-        readinessProbe:
-          failureThreshold: 10
-          httpGet:
-            path: /readyz
-            port: 9440
-          initialDelaySeconds: 10
-          periodSeconds: 10
-          successThreshold: 1
-          timeoutSeconds: 2
-        securityContext:
-          allowPrivilegeEscalation: false
         volumeMounts:
         - mountPath: /tmp/k8s-webhook-server/serving-certs
           name: cert
           readOnly: true
-      serviceAccountName: baremetal-operator-controller-manager
       terminationGracePeriodSeconds: 10
       volumes:
       - name: cert
diff --git a/controllers/metal3.io/baremetalhost_controller.go b/controllers/metal3.io/baremetalhost_controller.go
index a5c3e2c7..bf43c8ee 100644
--- a/controllers/metal3.io/baremetalhost_controller.go
+++ b/controllers/metal3.io/baremetalhost_controller.go
@@ -483,7 +483,7 @@ func hasInspectAnnotation(host *metal3v1alpha1.BareMetalHost) bool {
 // clearError removes any existing error message.
 func clearError(host *metal3v1alpha1.BareMetalHost) (dirty bool) {
 	dirty = host.SetOperationalStatus(metal3v1alpha1.OperationalStatusOK)
-	var emptyErrType metal3v1alpha1.ErrorType
+	var emptyErrType metal3v1alpha1.ErrorType = ""
 	if host.Status.ErrorType != emptyErrType {
 		host.Status.ErrorType = emptyErrType
 		dirty = true
@@ -526,13 +526,6 @@ func (r *BareMetalHostReconciler) actionDeleting(prov provisioner.Provisioner, i
 	}
 
 	// Remove finalizer to allow deletion
-	secretManager := secretutils.NewSecretManager(info.log, r.Client, r.APIReader)
-
-	err = secretManager.ReleaseSecret(info.bmcCredsSecret)
-	if err != nil {
-		return actionError{err}
-	}
-
 	info.host.Finalizers = utils.FilterStringFromList(
 		info.host.Finalizers, metal3v1alpha1.BareMetalHostFinalizer)
 	info.log.Info("cleanup is complete, removed finalizer",
@@ -625,26 +618,13 @@ func (r *BareMetalHostReconciler) preprovImageAvailable(info *reconcileInfo, ima
 		return false, nil
 	}
 
-	validFormat := false
-	for _, f := range image.Spec.AcceptFormats {
-		if image.Status.Format == f {
-			validFormat = true
-			break
-		}
-	}
-	if !validFormat {
-		info.log.Info("pre-provisioning image format not accepted",
-			"format", image.Status.Format)
-		return false, nil
-	}
-
 	if image.Spec.NetworkDataName != "" {
 		secretKey := client.ObjectKey{
 			Name:      image.Spec.NetworkDataName,
 			Namespace: image.ObjectMeta.Namespace,
 		}
 		secretManager := r.secretManager(info.log)
-		networkData, err := secretManager.AcquireSecret(secretKey, info.host, false, false)
+		networkData, err := secretManager.AcquireSecret(secretKey, info.host, false)
 		if err != nil {
 			return false, err
 		}
@@ -660,13 +640,17 @@ func (r *BareMetalHostReconciler) preprovImageAvailable(info *reconcileInfo, ima
 		return false, nil
 	}
 
-	if errCond := meta.FindStatusCondition(image.Status.Conditions, string(metal3v1alpha1.ConditionImageError)); errCond.Status == metav1.ConditionTrue {
-		info.log.Info("error building PreprovisioningImage",
-			"message", errCond.Message)
-		return false, imageBuildError{errCond.Message}
-	}
-	if meta.IsStatusConditionTrue(image.Status.Conditions, string(metal3v1alpha1.ConditionImageReady)) {
-		return true, nil
+	for _, cond := range image.Status.Conditions {
+		if cond.Status == metav1.ConditionTrue {
+			switch metal3v1alpha1.ImageStatusConditionType(cond.Type) {
+			case metal3v1alpha1.ConditionImageReady:
+				return true, nil
+			case metal3v1alpha1.ConditionImageError:
+				info.log.Info("error building PreprovisioningImage",
+					"message", cond.Message)
+				return false, imageBuildError{cond.Message}
+			}
+		}
 	}
 
 	info.log.Info("pending PreprovisioningImage not ready")
@@ -697,7 +681,6 @@ func (r *BareMetalHostReconciler) getPreprovImage(info *reconcileInfo, formats [
 	expectedSpec := metal3v1alpha1.PreprovisioningImageSpec{
 		NetworkDataName: info.host.Spec.PreprovisioningNetworkDataName,
 		Architecture:    getHostArchitecture(info.host),
-		AcceptFormats:   formats,
 	}
 
 	preprovImage := metal3v1alpha1.PreprovisioningImage{}
@@ -1441,7 +1424,7 @@ func (r *BareMetalHostReconciler) getBMCSecretAndSetOwner(request ctrl.Request,
 	reqLogger := r.Log.WithValues("baremetalhost", request.NamespacedName)
 	secretManager := r.secretManager(reqLogger)
 
-	bmcCredsSecret, err := secretManager.AcquireSecret(host.CredentialsKey(), host, true, true)
+	bmcCredsSecret, err := secretManager.AcquireSecret(host.CredentialsKey(), host, true)
 	if err != nil {
 		if k8serrors.IsNotFound(err) {
 			return nil, &ResolveBMCSecretRefError{message: fmt.Sprintf("The BMC secret %s does not exist", host.CredentialsKey())}
diff --git a/controllers/metal3.io/preprovisioningimage_controller.go b/controllers/metal3.io/preprovisioningimage_controller.go
index 1f9f83e2..16622831 100644
--- a/controllers/metal3.io/preprovisioningimage_controller.go
+++ b/controllers/metal3.io/preprovisioningimage_controller.go
@@ -18,10 +18,10 @@ package controllers
 
 import (
 	"context"
+	"os"
 	"time"
 
 	"github.com/go-logr/logr"
-	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	apiequality "k8s.io/apimachinery/pkg/api/equality"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
@@ -32,9 +32,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-	"github.com/metal3-io/baremetal-operator/pkg/imageprovider"
 	"github.com/metal3-io/baremetal-operator/pkg/secretutils"
-	"github.com/metal3-io/baremetal-operator/pkg/utils"
 )
 
 const (
@@ -45,10 +43,9 @@ const (
 // PreprovisioningImageReconciler reconciles a PreprovisioningImage object
 type PreprovisioningImageReconciler struct {
 	client.Client
-	Log           logr.Logger
-	Scheme        *runtime.Scheme
-	APIReader     client.Reader
-	ImageProvider imageprovider.ImageProvider
+	Log       logr.Logger
+	Scheme    *runtime.Scheme
+	APIReader client.Reader
 }
 
 type imageConditionReason string
@@ -78,30 +75,6 @@ func (r *PreprovisioningImageReconciler) Reconcile(ctx context.Context, req ctrl
 		return ctrl.Result{}, err
 	}
 
-	if !img.DeletionTimestamp.IsZero() {
-		log.Info("cleaning up deleted resource")
-		if err := r.discardExistingImage(&img, log); err != nil {
-			return ctrl.Result{}, err
-		}
-		img.Finalizers = utils.FilterStringFromList(
-			img.Finalizers, metal3.PreprovisioningImageFinalizer)
-		err := r.Update(ctx, &img)
-		if err != nil {
-			return ctrl.Result{}, errors.Wrap(err, "failed to remove finalizer")
-		}
-		return ctrl.Result{}, nil
-	}
-
-	if !utils.StringInList(img.Finalizers, metal3.PreprovisioningImageFinalizer) {
-		log.Info("adding finalizer")
-		img.Finalizers = append(img.Finalizers, metal3.PreprovisioningImageFinalizer)
-		err := r.Update(ctx, &img)
-		if err != nil {
-			return ctrl.Result{}, errors.Wrap(err, "failed to add finalizer")
-		}
-		return ctrl.Result{}, nil
-	}
-
 	changed, err := r.update(&img, log)
 
 	if k8serrors.IsNotFound(err) {
@@ -117,102 +90,42 @@ func (r *PreprovisioningImageReconciler) Reconcile(ctx context.Context, req ctrl
 	return result, err
 }
 
-func configChanged(img *metal3.PreprovisioningImage, format metal3.ImageFormat, networkDataStatus metal3.SecretStatus) bool {
-	return !(img.Status.Format == format &&
-		img.Status.Architecture == img.Spec.Architecture &&
-		img.Status.NetworkData == networkDataStatus)
-}
-
 func (r *PreprovisioningImageReconciler) update(img *metal3.PreprovisioningImage, log logr.Logger) (bool, error) {
 	generation := img.GetGeneration()
 
-	if !r.ImageProvider.SupportsArchitecture(img.Spec.Architecture) {
-		log.Info("image architecture not supported", "architecture", img.Spec.Architecture)
-		return setError(generation, &img.Status, reasonImageConfigurationError, "Architecture not supported"), nil
-	}
-
-	format := r.getImageFormat(img.Spec, log)
-	if format == "" {
-		return setError(generation, &img.Status, reasonImageConfigurationError, "No acceptable image format supported"), nil
+	url, format, errorMessage := getImageURL()
+	if errorMessage != "" {
+		log.Info("no suitable image URL available", "preferredFormat", format)
+		return setError(generation, &img.Status, reasonImageConfigurationError, errorMessage), nil
 	}
 
+	log.Info("image URL available", "url", url, "format", format)
 	secretManager := secretutils.NewSecretManager(log, r.Client, r.APIReader)
-	networkData, secretStatus, err := getNetworkData(secretManager, img)
-	if err != nil {
-		if k8serrors.IsNotFound(err) {
-			log.Info("network data Secret does not exist")
-			return setError(generation, &img.Status, reasonImageMissingNetworkData, "NetworkData secret not found"), err
-		}
-		return false, err
+	secretStatus, err := getNetworkDataStatus(secretManager, img)
+	if err == nil {
+		return setImage(generation, &img.Status, url, format,
+			secretStatus, img.Spec.Architecture,
+			"Set default image"), nil
 	}
 
-	if configChanged(img, format, secretStatus) {
-		reason := "Config changed"
-		if meta.IsStatusConditionTrue(img.Status.Conditions, string(metal3.ConditionImageReady)) {
-			// Ensure we mark the status as not ready before we remove the build
-			// from the image cache.
-			setUnready(generation, &img.Status, reason)
-		} else {
-			if err := r.discardExistingImage(img, log); err != nil {
-				return false, err
-			}
-			// Set up all the data before building the image and adding the URL,
-			// so that even if we fail to write the built image status and the
-			// config subsequently changes, the image cache cannot leak.
-			setImage(generation, &img.Status, "", format,
-				secretStatus, img.Spec.Architecture,
-				reason)
-		}
-		return true, nil
-	}
-
-	var networkDataContent imageprovider.NetworkData
-	if networkData != nil {
-		networkDataContent = networkData.Data
-	}
-	url, err := r.ImageProvider.BuildImage(imageprovider.ImageData{
-		ImageMetadata:     img.ObjectMeta.DeepCopy(),
-		Format:            format,
-		Architecture:      img.Spec.Architecture,
-		NetworkDataStatus: secretStatus,
-	}, networkDataContent, log)
-	if err != nil {
-		return false, err
+	if k8serrors.IsNotFound(err) {
+		log.Info("network data Secret does not exist")
+		return setError(generation, &img.Status, reasonImageMissingNetworkData, "NetworkData secret not found"), err
 	}
-	log.Info("image URL available", "url", url, "format", format)
 
-	return setImage(generation, &img.Status, url, format,
-		secretStatus, img.Spec.Architecture,
-		"Generated image"), nil
+	return false, err
 }
 
-func (r *PreprovisioningImageReconciler) getImageFormat(spec metal3.PreprovisioningImageSpec, log logr.Logger) (format metal3.ImageFormat) {
-	for _, acceptableFormat := range spec.AcceptFormats {
-		if r.ImageProvider.SupportsFormat(acceptableFormat) {
-			return acceptableFormat
-		}
-	}
-
-	if len(spec.AcceptFormats) > 0 {
-		log = log.WithValues("preferredFormat", spec.AcceptFormats[0])
+func getImageURL() (url string, format metal3.ImageFormat, errorMessage string) {
+	format = metal3.ImageFormatISO
+	if iso := os.Getenv("DEPLOY_ISO_URL"); iso != "" {
+		url = iso
+	} else {
+		errorMessage = "No DEPLOY_ISO_URL specified"
 	}
-	log.Info("no acceptable image format supported")
 	return
 }
 
-func (r *PreprovisioningImageReconciler) discardExistingImage(img *metal3.PreprovisioningImage, log logr.Logger) error {
-	if img.Status.Format == "" {
-		return nil
-	}
-	log.Info("discarding existing image", "image_url", img.Status.ImageUrl)
-	return r.ImageProvider.DiscardImage(imageprovider.ImageData{
-		ImageMetadata:     img.ObjectMeta.DeepCopy(),
-		Format:            img.Status.Format,
-		Architecture:      img.Status.Architecture,
-		NetworkDataStatus: img.Status.NetworkData,
-	})
-}
-
 func getErrorRetryDelay(status metal3.PreprovisioningImageStatus) time.Duration {
 	errorCond := meta.FindStatusCondition(status.Conditions, string(metal3.ConditionImageError))
 	if errorCond == nil || errorCond.Status != metav1.ConditionTrue {
@@ -228,22 +141,22 @@ func getErrorRetryDelay(status metal3.PreprovisioningImageStatus) time.Duration
 	return delay
 }
 
-func getNetworkData(secretManager secretutils.SecretManager, img *metal3.PreprovisioningImage) (*corev1.Secret, metal3.SecretStatus, error) {
+func getNetworkDataStatus(secretManager secretutils.SecretManager, img *metal3.PreprovisioningImage) (metal3.SecretStatus, error) {
 	networkDataSecret := img.Spec.NetworkDataName
 	if networkDataSecret == "" {
-		return nil, metal3.SecretStatus{}, nil
+		return metal3.SecretStatus{}, nil
 	}
 
 	secretKey := client.ObjectKey{
 		Name:      networkDataSecret,
 		Namespace: img.ObjectMeta.Namespace,
 	}
-	secret, err := secretManager.AcquireSecret(secretKey, img, false, false)
+	secret, err := secretManager.AcquireSecret(secretKey, img, false)
 	if err != nil {
-		return nil, metal3.SecretStatus{}, err
+		return metal3.SecretStatus{}, err
 	}
 
-	return secret, metal3.SecretStatus{
+	return metal3.SecretStatus{
 		Name:    networkDataSecret,
 		Version: secret.GetResourceVersion(),
 	}, nil
@@ -275,12 +188,8 @@ func setImage(generation int64, status *metal3.PreprovisioningImageStatus, url s
 
 	time := metav1.Now()
 	reason := reasonImageSuccess
-	ready := metav1.ConditionFalse
-	if url != "" {
-		ready = metav1.ConditionTrue
-	}
 	setImageCondition(generation, newStatus,
-		metal3.ConditionImageReady, ready,
+		metal3.ConditionImageReady, metav1.ConditionTrue,
 		time, reason, message)
 	setImageCondition(generation, newStatus,
 		metal3.ConditionImageError, metav1.ConditionFalse,
@@ -291,20 +200,6 @@ func setImage(generation int64, status *metal3.PreprovisioningImageStatus, url s
 	return changed
 }
 
-func setUnready(generation int64, status *metal3.PreprovisioningImageStatus, message string) bool {
-	newStatus := status.DeepCopy()
-
-	time := metav1.Now()
-	reason := reasonImageSuccess
-	setImageCondition(generation, newStatus,
-		metal3.ConditionImageReady, metav1.ConditionFalse,
-		time, reason, message)
-
-	changed := !apiequality.Semantic.DeepEqual(status, &newStatus)
-	*status = *newStatus
-	return changed
-}
-
 func setError(generation int64, status *metal3.PreprovisioningImageStatus, reason imageConditionReason, message string) bool {
 	newStatus := status.DeepCopy()
 	newStatus.ImageUrl = ""
@@ -323,13 +218,15 @@ func setError(generation int64, status *metal3.PreprovisioningImageStatus, reaso
 }
 
 func (r *PreprovisioningImageReconciler) CanStart() bool {
-	for _, fmt := range []metal3.ImageFormat{metal3.ImageFormatISO, metal3.ImageFormatInitRD} {
-		if r.ImageProvider.SupportsFormat(fmt) {
-			return true
-		}
-	}
-	r.Log.Info("not starting preprovisioning image controller; no image data available")
-	return false
+	deployISOURL := os.Getenv("DEPLOY_ISO_URL")
+	hasCfg := deployISOURL != ""
+	if hasCfg {
+		r.Log.Info("have deploy image data",
+			"iso_url", deployISOURL)
+	} else {
+		r.Log.Info("not starting preprovisioning image controller; no image data available")
+	}
+	return hasCfg
 }
 
 func (r *PreprovisioningImageReconciler) SetupWithManager(mgr ctrl.Manager) error {
diff --git a/docs/api.md b/docs/api.md
index b9634262..7e4a8576 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -589,3 +589,252 @@ state.
 
 Please note only the existence of the annotation is important to treat the BMH
 as detached and the value of the annotation is always ignored.
+
+## HostFirmwareSettings
+
+A **HostFirmwareSettings** resource is used to manage BIOS settings for a host,
+there is a one-to-one mapping with **BareMetalHosts**.  A
+**HostFirmwareSettings** resource is created when BIOS settings are read from
+Ironic as the host moves to the Ready state.  These settings are the complete
+actual BIOS configuration names returned from the BMC, typically 100-200
+settings per host, as compared to the three vendor-independent fields stored in
+the **BareMetalHosts** `firmware` field.
+
+### HostFirmwareSettings spec
+
+The *HostFirmwareSettings's* *spec* defines the desired BIOS settings. These
+settings will be sent to Ironic as part of clean-steps for update to the BMC
+when the host goes through cleaning, i.e. when the **BareMetalHosts** go
+through the Preparing state.
+
+#### spec settings
+
+The `settings` are an array of name/value pairs for the BIOS settings.
+The names must match the names read from Ironic and stored in the `status`
+field. The values must be within the limits as defined in the *FirmwareSchema*.
+Only settings which are not defined as `ReadOnly` or `Unique` (such as
+SerialNumbers) will be accepted.
+
+### HostFirmwareSettings status
+
+The *HostFirmwareSettings's* *status* defines the actual BIOS settings read
+from Ironic.
+
+#### status schema
+
+`Schema` is a reference to a *FirmwareSchema* resource that describes each
+BIOS setting by type and configurable limits for the type.
+
+#### status settings
+
+The `settings` are an array of name/value pairs listing the complete set
+of BIOS settings retrieved from Ironic.
+
+#### status conditions
+
+`conditions` reflects the status of the fields in the *spec*. Possible
+conditions are:
+
+* *Valid* -- When set to *True* indicates that all *settings* in the *spec* are
+  correct for names and values. This is also set to *True* when nothing is set
+  in the *spec*. When set to *False* indicates that one or more names or values
+  in the *spec* are incorrect, the actual error will be shown in the *Events*
+  field.
+* *UpdateRequested* -- Indicates whether or not settings in the *spec* are
+  different than settings in the *status*. When set to *True* the settings that
+  are different will be included in the clean-steps that are written to Ironic
+  as part of cleaning.
+
+### HostFirmwareSettings Example
+
+The following is a complete example from a running cluster of a
+*HostFirmwareSettings* resource (in YAML), it includes its spec and status
+sections:
+
+```yaml
+apiVersion: metal3.io/v1alpha1
+kind: HostFirmwareSettings
+metadata:
+  creationTimestamp: "2021-11-03T21:21:02Z"
+  generation: 1
+  name: ostest-worker-0
+  namespace: openshift-machine-api
+  ownerReferences:
+  - apiVersion: metal3.io/v1alpha1
+    blockOwnerDeletion: true
+    controller: true
+    kind: BareMetalHost
+    name: ostest-worker-0
+    uid: 87b08d19-b94c-4a29-901a-67890d9eb843
+  resourceVersion: "24688"
+  uid: 293a351b-1743-437d-abed-da53d41d8804
+spec:
+  settings: {}
+status:
+  conditions:
+  - lastTransitionTime: "2021-11-03T21:21:54Z"
+    message: ""
+    observedGeneration: 1
+    reason: Success
+    status: "False"
+    type: UpdateRequested
+  - lastTransitionTime: "2021-11-03T21:21:54Z"
+    message: ""
+    observedGeneration: 1
+    reason: Success
+    status: "True"
+    type: Valid
+  schema:
+    name: schema-dc98d7c8
+    namespace: openshift-machine-api
+  settings:
+    BootMode: Uefi
+    EmbeddedSata: Raid
+    L2Cache: 10x256 KB
+    NicBoot1: NetworkBoot
+    NumCores: "10"
+    ProcTurboMode: Enabled
+    QuietBoot: "true"
+    SecureBootStatus: Enabled
+    SerialNumber: QPX12345
+```
+
+## FirmwareSchema
+
+A **FirmwareSchema** resource contains the limits each setting, specific to
+each host.  This data comes directly from the BMC via Ironic. It can be used
+to prevent misconfiguration of the **HostFirmwareSettings** *spec* field so
+that invalid values are not sent to the host. The **FirmwareSchema** has a
+unique identifier derived from its settings and limits. Multiple hosts may therefore
+have the same **FirmwareSchema** identifier so its likely that more than one
+**HostFirmwareSettings** reference the same **FirmwareSchema** when
+hardware of the same vendor and model are used.
+
+### FirmwareSchema spec
+
+#### spec schema
+
+A map of settings names and limits. The values returned in the limits depend
+on the type of the setting. The following fields are included:
+
+* *attribute_type* -- The type of setting - `Enumeration`, `Integer`, `String`,
+  `Boolean`, or `Password`
+* *allowable_values* -- A list of allowable values when the `attribute_type` is `Enumeration`
+* *lower_bound* -- The lowest allowed value when attribute_type is `Integer`
+* *upper_bound* -- The highest allowed value when attribute_type is `Integer`
+* *min_length* -- The shortest string length that the value can have when
+  attribute_type is `String`
+* *max_length* -- The longest string length that the value can have when
+  attribute_type is `String`
+* *read_only* -- The setting is ready only and cannot be modified
+* *unique* -- The setting is specific to this host
+* *reset_required* -- After changing this setting a node reboot is required
+
+#### hardwareVendor
+
+The name of the vendor that this schema corresponds to.
+
+#### hardwareModel
+
+The hardware model that this schema corresponds to.
+
+### FirmwareSchema Example
+
+```yaml
+apiVersion: v1
+items:
+- apiVersion: metal3.io/v1alpha1
+  kind: FirmwareSchema
+  metadata:
+    creationTimestamp: "2021-11-03T21:21:54Z"
+    generation: 1
+    name: schema-4f53cda1
+    namespace: openshift-machine-api
+    ownerReferences:
+    - apiVersion: metal3.io/v1alpha1
+      kind: HostFirmwareSettings
+      name: ostest-master-0
+      uid: 8c315c33-29b0-4863-a61d-ce5ddde58498
+    resourceVersion: "19133"
+    uid: d169cd94-4d6e-4567-a1b9-d5f4962a8dee
+  spec:
+    hardwareModel: KVM (8.2.0)
+    hardwareVendor: Red Hat
+    schema: {}
+- apiVersion: metal3.io/v1alpha1
+  kind: FirmwareSchema
+  metadata:
+    creationTimestamp: "2021-11-03T21:21:54Z"
+    generation: 1
+    name: schema-dc98d7c8
+    namespace: openshift-machine-api
+    ownerReferences:
+    - apiVersion: metal3.io/v1alpha1
+      kind: HostFirmwareSettings
+      name: ostest-master-1
+      uid: a991875d-9897-49f1-9d86-16ea9ed6c84f
+    resourceVersion: "19141"
+    uid: b442e01f-3724-4f14-a578-f0b99d296c95
+  spec:
+    hardwareModel: KVM (8.2.0)
+    hardwareVendor: Red Hat
+    schema:
+      BootMode:
+        allowable_values:
+        - Bios
+        - Uefi
+        attribute_type: Enumeration
+        read_only: false
+      EmbeddedSata:
+        allowable_values:
+        - Ata
+        - Ahci
+        - Raid
+        - "Off"
+        attribute_type: Enumeration
+        read_only: false
+     L2Cache:
+        attribute_type: String
+        max_length: 16
+        min_length: 0
+        read_only: false
+        unique: false
+      NicBoot1:
+        allowable_values:
+        - NetworkBoot
+        - Disabled
+        attribute_type: Enumeration
+        read_only: false
+      NumCores:
+        attribute_type: Integer
+        lower_bound: 10
+        read_only: true
+        unique: false
+        upper_bound: 20
+      ProcTurboMode:
+        allowable_values:
+        - Enabled
+        - Disabled
+        attribute_type: Enumeration
+        read_only: false
+      QuietBoot:
+        attribute_type: Boolean
+        read_only: false
+        unique: false
+      SecureBootStatus:
+        allowable_values:
+        - Enabled
+        - Disabled
+        attribute_type: Enumeration
+        read_only: true
+      SerialNumber:
+        attribute_type: String
+        max_length: 16
+        min_length: 0
+        read_only: false
+        unique: true
+      SysPassword:
+        attribute_type: Password
+        read_only: false
+        unique: false
+```
diff --git a/docs/dev-setup.md b/docs/dev-setup.md
index e06cc44e..ce547632 100644
--- a/docs/dev-setup.md
+++ b/docs/dev-setup.md
@@ -172,8 +172,8 @@ and clean it with
 
 It is also possible to develop Baremetal Operator using Tilt with CAPM3. Please
 refer to
-[the development setup guide of CAPM3](https://github.com/metal3-io/cluster-api-provider-metal3/blob/main/docs/dev-setup.md#tilt-for-dev-in-capm3)
-and specially the [Baremetal Operator Integration](https://github.com/metal3-io/cluster-api-provider-metal3/blob/main/docs/dev-setup.md#including-baremetal-operator-and-ip-address-manager)
+[the development setup guide of CAPM3](https://github.com/metal3-io/cluster-api-provider-metal3/blob/master/docs/dev-setup.md#tilt-for-dev-in-capm3)
+and specially the [Baremetal Operator Integration](https://github.com/metal3-io/cluster-api-provider-metal3/blob/master/docs/dev-setup.md#including-baremetal-operator-and-ip-address-manager)
 
 ## Using libvirt VMs with Ironic
 
diff --git a/hack/manifestlint.sh b/hack/manifestlint.sh
index 1e0c2724..8698aba3 100755
--- a/hack/manifestlint.sh
+++ b/hack/manifestlint.sh
@@ -23,7 +23,7 @@ if [ "${IS_CONTAINER}" != "false" ]; then
     { set +x; } 2>/dev/null
     echo "<-------------------------STARTING MANIFESTS VALIDATION CHECKS------------------------->"
     kubeval --strict --ignore-missing-schemas \
-    -d config,examples -i kustom,patch,controller_manager_config -o tap
+    -d config,examples -i kustom,patch -o tap
     echo "<-------------------------COMPLETED MANIFESTS VALIDATION CHECKS------------------------>"
 else
   "${CONTAINER_RUNTIME}" run --rm \
diff --git a/hack/unit.sh b/hack/unit.sh
index 6993ccc7..05bace2a 100755
--- a/hack/unit.sh
+++ b/hack/unit.sh
@@ -11,7 +11,9 @@ if [ "${IS_CONTAINER}" != "false" ]; then
   eval "$(go env)"
   cd "${GOPATH}"/src/github.com/metal3-io/baremetal-operator
   export XDG_CACHE_HOME="/tmp/.cache"
+
   export COVER_PROFILE="${ARTIFACTS}"/cover.out
+
   TEST_FLAGS=${TEST_FLAGS} make -e unit-cover
 
 else
diff --git a/ironic-deployment/ironic/ironic.yaml b/ironic-deployment/ironic/ironic.yaml
index 9f859267..cb3dc54b 100644
--- a/ironic-deployment/ironic/ironic.yaml
+++ b/ironic-deployment/ironic/ironic.yaml
@@ -26,22 +26,6 @@ spec:
                add: ["NET_ADMIN"]
           command:
             - /bin/rundnsmasq
-          livenessProbe:
-           exec:
-             command: ["sh", "-c", "ss -lun | grep :67 && ss -lun | grep :69"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
-          readinessProbe:
-           exec:
-             command: ["sh", "-c", "ss -lun | grep :67 && ss -lun | grep :69"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
           volumeMounts:
             - mountPath: /shared
               name: ironic-data-volume
@@ -53,22 +37,6 @@ spec:
           imagePullPolicy: Always
           command:
             - /bin/runmariadb
-          livenessProbe:
-           exec:
-             command: ["sh", "-c", "mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
-          readinessProbe:
-           exec:
-             command: ["sh", "-c", "mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
           volumeMounts:
             - mountPath: /shared
               name: ironic-data-volume
@@ -88,22 +56,6 @@ spec:
           imagePullPolicy: Always
           command:
             - /bin/runironic-api
-          livenessProbe:
-           exec:
-             command: ["sh", "-c", "curl -sSf http://127.0.0.1:6385 || curl -sSfk https://127.0.0.1:6385"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
-          readinessProbe:
-           exec:
-             command: ["sh", "-c", "curl -sSf http://127.0.0.1:6385 || curl -sSfk https://127.0.0.1:6385"]
-           initialDelaySeconds: 30
-           periodSeconds: 30
-           timeoutSeconds: 10
-           successThreshold: 1
-           failureThreshold: 10
           volumeMounts:
             - mountPath: /shared
               name: ironic-data-volume
@@ -121,22 +73,6 @@ spec:
           imagePullPolicy: Always
           command:
             - /bin/runironic-conductor
-          readinessProbe:
-            exec:
-              command: ["sh", "-c", "curl -sd '{}' -o – -k https://127.0.0.1:8089 || curl -sd '{}' -o – http://127.0.0.1:8089"]
-            initialDelaySeconds: 30
-            periodSeconds: 30
-            timeoutSeconds: 10
-            successThreshold: 1
-            failureThreshold: 10
-          livenessProbe:
-            exec:
-              command: ["sh", "-c", "curl -sd '{}' -o – -k https://127.0.0.1:8089 || curl -sd '{}' -o – http://127.0.0.1:8089"]
-            initialDelaySeconds: 30
-            periodSeconds: 30
-            timeoutSeconds: 10
-            successThreshold: 1
-            failureThreshold: 10
           volumeMounts:
             - mountPath: /shared
               name: ironic-data-volume
@@ -160,22 +96,6 @@ spec:
         - name: ironic-inspector
           image: quay.io/metal3-io/ironic
           imagePullPolicy: Always
-          readinessProbe:
-            exec:
-              command: ["sh", "-c", "curl -sSf http://127.0.0.1:5050 || curl -sSf -k https://127.0.0.1:5050"]
-            initialDelaySeconds: 30
-            periodSeconds: 30
-            timeoutSeconds: 10
-            successThreshold: 1
-            failureThreshold: 10
-          livenessProbe:
-            exec:
-              command: ["sh", "-c", "curl -sSf http://127.0.0.1:5050 || curl -sSf -k https://127.0.0.1:5050"]
-            initialDelaySeconds: 30
-            periodSeconds: 30
-            timeoutSeconds: 10
-            successThreshold: 1
-            failureThreshold: 10
           command:
             - /bin/runironic-inspector
           envFrom:
diff --git a/main.go b/main.go
index db41cb11..2c259c97 100644
--- a/main.go
+++ b/main.go
@@ -1,5 +1,6 @@
 /*
 
+
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
@@ -31,7 +32,6 @@ import (
 
 	metal3iov1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 	metal3iocontroller "github.com/metal3-io/baremetal-operator/controllers/metal3.io"
-	"github.com/metal3-io/baremetal-operator/pkg/imageprovider"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner/demo"
 	"github.com/metal3-io/baremetal-operator/pkg/provisioner/fixture"
@@ -83,7 +83,7 @@ func setupWebhooks(mgr ctrl.Manager) {
 
 func main() {
 	var watchNamespace string
-	var metricsBindAddr string
+	var metricsAddr string
 	var enableLeaderElection bool
 	var preprovImgEnable bool
 	var devLogging bool
@@ -97,7 +97,7 @@ func main() {
 	// namespace.
 	flag.StringVar(&watchNamespace, "namespace", os.Getenv("WATCH_NAMESPACE"),
 		"Namespace that the controller watches to reconcile host resources.")
-	flag.StringVar(&metricsBindAddr, "metrics-addr", "127.0.0.1:8085",
+	flag.StringVar(&metricsAddr, "metrics-addr", "127.0.0.1:8085",
 		"The address the metric endpoint binds to.")
 	flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
 		"Enable leader election for controller manager. "+
@@ -126,7 +126,7 @@ func main() {
 
 	mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
 		Scheme:                  scheme,
-		MetricsBindAddress:      metricsBindAddr,
+		MetricsBindAddress:      metricsAddr,
 		Port:                    webhookPort,
 		LeaderElection:          enableLeaderElection,
 		LeaderElectionID:        "baremetal-operator",
@@ -166,11 +166,10 @@ func main() {
 
 	if preprovImgEnable {
 		imgReconciler := metal3iocontroller.PreprovisioningImageReconciler{
-			Client:        mgr.GetClient(),
-			Log:           ctrl.Log.WithName("controllers").WithName("PreprovisioningImage"),
-			APIReader:     mgr.GetAPIReader(),
-			Scheme:        mgr.GetScheme(),
-			ImageProvider: imageprovider.NewDefaultImageProvider(),
+			Client:    mgr.GetClient(),
+			Log:       ctrl.Log.WithName("controllers").WithName("PreprovisioningImage"),
+			APIReader: mgr.GetAPIReader(),
+			Scheme:    mgr.GetScheme(),
 		}
 		if imgReconciler.CanStart() {
 			if err = (&imgReconciler).SetupWithManager(mgr); err != nil {
diff --git a/pkg/imageprovider/default.go b/pkg/imageprovider/default.go
deleted file mode 100644
index c6de4f70..00000000
--- a/pkg/imageprovider/default.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package imageprovider
-
-import (
-	"fmt"
-	"os"
-
-	"github.com/go-logr/logr"
-
-	metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-)
-
-type envImageProvider struct {
-	isoURL    string
-	initrdURL string
-}
-
-func NewDefaultImageProvider() ImageProvider {
-	return envImageProvider{
-		isoURL:    os.Getenv("DEPLOY_ISO_URL"),
-		initrdURL: os.Getenv("DEPLOY_RAMDISK_URL"),
-	}
-}
-
-func (eip envImageProvider) SupportsArchitecture(arch string) bool {
-	return true
-}
-
-func (eip envImageProvider) SupportsFormat(format metal3.ImageFormat) bool {
-	switch format {
-	case metal3.ImageFormatISO:
-		return eip.isoURL != ""
-	case metal3.ImageFormatInitRD:
-		// Assume we are running inside the same process as the BMH controller -
-		// if there is no kernel URL then it will be unable to use the initrd.
-		if os.Getenv("DEPLOY_KERNEL_URL") == "" {
-			return false
-		}
-		return eip.initrdURL != ""
-	default:
-		return false
-	}
-}
-
-func (eip envImageProvider) BuildImage(data ImageData, networkData NetworkData, log logr.Logger) (url string, err error) {
-	switch data.Format {
-	case metal3.ImageFormatISO:
-		url = eip.isoURL
-	case metal3.ImageFormatInitRD:
-		url = eip.initrdURL
-	}
-	if url == "" {
-		err = fmt.Errorf("Unsupported image format \"%s\"", data.Format)
-	}
-	return
-}
-
-func (eip envImageProvider) DiscardImage(data ImageData) error {
-	return nil
-}
diff --git a/pkg/imageprovider/imageprovider.go b/pkg/imageprovider/imageprovider.go
deleted file mode 100644
index ab47ba64..00000000
--- a/pkg/imageprovider/imageprovider.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package imageprovider
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-
-	"github.com/go-logr/logr"
-
-	metal3 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-)
-
-// ImageData contains information about the image type being requested, and
-// metadata about the request.
-type ImageData struct {
-	ImageMetadata     *metav1.ObjectMeta
-	Format            metal3.ImageFormat
-	Architecture      string
-	NetworkDataStatus metal3.SecretStatus
-}
-
-type NetworkData map[string][]byte
-
-type ImageProvider interface {
-	// SupportsArchitecture returns whether the ImageProvider can provide
-	// images for the given processor architecture.
-	SupportsArchitecture(string) bool
-
-	// SupportsFormat returns whether the ImageProvider can provide images in
-	// the given format.
-	SupportsFormat(metal3.ImageFormat) bool
-
-	// BuildImage requests the ImageProvider to build an image with the
-	// supplied network data and return a URL where it can be accessed.
-	BuildImage(ImageData, NetworkData, logr.Logger) (string, error)
-
-	// DiscardImage notifies the ImageProvider that a previously built image
-	// is no longer required.
-	DiscardImage(ImageData) error
-}
diff --git a/pkg/ironic/bmc/access.go b/pkg/ironic/bmc/access.go
index 751fcf8f..b8efa128 100644
--- a/pkg/ironic/bmc/access.go
+++ b/pkg/ironic/bmc/access.go
@@ -7,6 +7,8 @@ import (
 	"strings"
 
 	"github.com/pkg/errors"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 // AccessDetailsFactory describes a callable that returns a new
@@ -28,17 +30,6 @@ func RegisterFactory(name string, factory AccessDetailsFactory, schemes []string
 	}
 }
 
-type FirmwareConfig struct {
-	// Supports the virtualization of platform hardware.
-	VirtualizationEnabled *bool
-
-	// Allows a single physical processor core to appear as several logical processors.
-	SimultaneousMultithreadingEnabled *bool
-
-	// SR-IOV support enables a hypervisor to create virtual instances of a PCI-express device, potentially increasing performance.
-	SriovEnabled *bool
-}
-
 // AccessDetails contains the information about how to get to a BMC.
 //
 // NOTE(dhellmann): This structure is very likely to change as we
@@ -79,11 +70,8 @@ type AccessDetails interface {
 	// Whether the driver supports booting a preprovisioning image in ISO format
 	SupportsISOPreprovisioningImage() bool
 
-	// RequiresProvisioningNetwork checks the driver requires provisioning network
-	RequiresProvisioningNetwork() bool
-
 	// Build bios clean steps for ironic
-	BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error)
+	BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error)
 }
 
 func getParsedURL(address string) (parsedURL *url.URL, err error) {
diff --git a/pkg/ironic/bmc/ibmc.go b/pkg/ironic/bmc/ibmc.go
index ba8185b3..623f81b1 100644
--- a/pkg/ironic/bmc/ibmc.go
+++ b/pkg/ironic/bmc/ibmc.go
@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"net/url"
 	"strings"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -111,11 +113,7 @@ func (a *ibmcAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *ibmcAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *ibmcAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *ibmcAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
diff --git a/pkg/ironic/bmc/idrac.go b/pkg/ironic/bmc/idrac.go
index b7b8cb84..4db59f22 100644
--- a/pkg/ironic/bmc/idrac.go
+++ b/pkg/ironic/bmc/idrac.go
@@ -3,6 +3,8 @@ package bmc
 import (
 	"net/url"
 	"strings"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -108,11 +110,7 @@ func (a *iDracAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *iDracAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *iDracAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *iDracAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig == nil {
 		return nil, nil
 	}
diff --git a/pkg/ironic/bmc/idrac_virtualmedia.go b/pkg/ironic/bmc/idrac_virtualmedia.go
index 7ae916d8..f4d69afe 100644
--- a/pkg/ironic/bmc/idrac_virtualmedia.go
+++ b/pkg/ironic/bmc/idrac_virtualmedia.go
@@ -3,6 +3,8 @@ package bmc
 import (
 	"fmt"
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -101,11 +103,7 @@ func (a *redfishiDracVirtualMediaAccessDetails) SupportsISOPreprovisioningImage(
 	return true
 }
 
-func (a *redfishiDracVirtualMediaAccessDetails) RequiresProvisioningNetwork() bool {
-	return false
-}
-
-func (a *redfishiDracVirtualMediaAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *redfishiDracVirtualMediaAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
diff --git a/pkg/ironic/bmc/ilo4.go b/pkg/ironic/bmc/ilo4.go
index 6dffa10f..cd5a2685 100644
--- a/pkg/ironic/bmc/ilo4.go
+++ b/pkg/ironic/bmc/ilo4.go
@@ -4,6 +4,8 @@ package bmc
 
 import (
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -102,11 +104,7 @@ func (a *iLOAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *iLOAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *iLOAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *iLOAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig == nil {
 		return nil, nil
 	}
diff --git a/pkg/ironic/bmc/ilo5.go b/pkg/ironic/bmc/ilo5.go
index 2cfbee1f..6c0f3538 100644
--- a/pkg/ironic/bmc/ilo5.go
+++ b/pkg/ironic/bmc/ilo5.go
@@ -4,6 +4,8 @@ package bmc
 
 import (
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -102,11 +104,7 @@ func (a *iLO5AccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *iLO5AccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *iLO5AccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *iLO5AccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig == nil {
 		return nil, nil
 	}
diff --git a/pkg/ironic/bmc/ipmi.go b/pkg/ironic/bmc/ipmi.go
index c4a29d00..0ad68483 100644
--- a/pkg/ironic/bmc/ipmi.go
+++ b/pkg/ironic/bmc/ipmi.go
@@ -3,6 +3,8 @@ package bmc
 import (
 	"fmt"
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -121,11 +123,7 @@ func (a *ipmiAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *ipmiAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *ipmiAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *ipmiAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
diff --git a/pkg/ironic/bmc/irmc.go b/pkg/ironic/bmc/irmc.go
index c6b12f83..0ce33998 100644
--- a/pkg/ironic/bmc/irmc.go
+++ b/pkg/ironic/bmc/irmc.go
@@ -2,6 +2,8 @@ package bmc
 
 import (
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -100,11 +102,7 @@ func (a *iRMCAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *iRMCAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *iRMCAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *iRMCAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig == nil {
 		return nil, nil
 	}
diff --git a/pkg/ironic/bmc/redfish.go b/pkg/ironic/bmc/redfish.go
index c2d78c33..8750662a 100644
--- a/pkg/ironic/bmc/redfish.go
+++ b/pkg/ironic/bmc/redfish.go
@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"net/url"
 	"strings"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -131,11 +133,7 @@ func (a *redfishAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *redfishAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *redfishAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *redfishAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
@@ -172,7 +170,7 @@ func (a *redfishiDracAccessDetails) VendorInterface() string {
 	return "idrac-redfish"
 }
 
-func (a *redfishiDracAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *redfishiDracAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
diff --git a/pkg/ironic/bmc/redfish_virtualmedia.go b/pkg/ironic/bmc/redfish_virtualmedia.go
index bd319d17..945a1002 100644
--- a/pkg/ironic/bmc/redfish_virtualmedia.go
+++ b/pkg/ironic/bmc/redfish_virtualmedia.go
@@ -3,6 +3,8 @@ package bmc
 import (
 	"fmt"
 	"net/url"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -99,11 +101,7 @@ func (a *redfishVirtualMediaAccessDetails) SupportsISOPreprovisioningImage() boo
 	return true
 }
 
-func (a *redfishVirtualMediaAccessDetails) RequiresProvisioningNetwork() bool {
-	return false
-}
-
-func (a *redfishVirtualMediaAccessDetails) BuildBIOSSettings(firmwareConfig *FirmwareConfig) (settings []map[string]string, err error) {
+func (a *redfishVirtualMediaAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 	if firmwareConfig != nil {
 		return nil, fmt.Errorf("firmware settings for %s are not supported", a.Driver())
 	}
diff --git a/pkg/ironic/go.mod b/pkg/ironic/go.mod
index 128d9601..ceb7a707 100644
--- a/pkg/ironic/go.mod
+++ b/pkg/ironic/go.mod
@@ -9,6 +9,7 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/stretchr/testify v1.7.0
 	go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489
+	sigs.k8s.io/controller-runtime v0.9.7
 )
 
 replace github.com/metal3-io/baremetal-operator/apis => ../../apis
diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go
index cdcdda84..3be305c9 100644
--- a/pkg/provisioner/ironic/ironic.go
+++ b/pkg/provisioner/ironic/ironic.go
@@ -554,6 +554,14 @@ func (p *ironicProvisioner) PreprovisioningImageFormats() ([]metal3v1alpha1.Imag
 	var formats []metal3v1alpha1.ImageFormat
 	if accessDetails.SupportsISOPreprovisioningImage() {
 		formats = append(formats, metal3v1alpha1.ImageFormatISO)
+	} else {
+		if p.config.deployKernelURL != "" && p.config.deployRamdiskURL != "" {
+			// This is a PXE driver (no ISO support) so it shouldn't require any
+			// network customisation to boot the image, and we have sufficient
+			// data available to configure. Therefore, do not request an image
+			// build.
+			return nil, nil
+		}
 	}
 	if p.config.deployKernelURL != "" {
 		formats = append(formats, metal3v1alpha1.ImageFormatInitRD)
@@ -603,6 +611,8 @@ func setDeployImage(driverInfo map[string]interface{}, config ironicConfig, acce
 			deployImageInfo[deployISOKey] = config.deployISOURL
 			return deployImageInfo
 		}
+	}
+	if !config.havePreprovImgBuilder || !allowISO {
 		if allowInitRD && config.deployRamdiskURL != "" {
 			deployImageInfo[deployKernelKey] = config.deployKernelURL
 			deployImageInfo[deployRamdiskKey] = config.deployRamdiskURL
@@ -1146,12 +1156,7 @@ func (p *ironicProvisioner) buildManualCleaningSteps(bmcAccess bmc.AccessDetails
 	cleanSteps = append(cleanSteps, raidCleanSteps...)
 
 	// Get the subset (currently 3) of vendor specific BIOS settings converted from common names
-	var firmwareConfig *bmc.FirmwareConfig
-	if data.FirmwareConfig != nil {
-		bmcConfig := bmc.FirmwareConfig(*data.FirmwareConfig)
-		firmwareConfig = &bmcConfig
-	}
-	bmcsettings, err := bmcAccess.BuildBIOSSettings(firmwareConfig)
+	bmcsettings, err := bmcAccess.BuildBIOSSettings(data.FirmwareConfig)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/secretutils/secret_manager.go b/pkg/secretutils/secret_manager.go
index 05a039ef..b7a525ed 100644
--- a/pkg/secretutils/secret_manager.go
+++ b/pkg/secretutils/secret_manager.go
@@ -12,13 +12,6 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
-
-	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
-	"github.com/metal3-io/baremetal-operator/pkg/utils"
-)
-
-const (
-	SecretsFinalizer = metal3v1alpha1.BareMetalHostFinalizer + "/secret"
 )
 
 // SecretManager is a type for fetching Secrets whether or not they are in the
@@ -65,7 +58,7 @@ func (sm *SecretManager) findSecret(key types.NamespacedName) (secret *corev1.Se
 // claimSecret ensures that the Secret has a label that will ensure it is
 // present in the cache (and that we can watch for changes), and optionally
 // that it has a particular owner reference.
-func (sm *SecretManager) claimSecret(secret *corev1.Secret, owner client.Object, ownerIsController, addFinalizer bool) error {
+func (sm *SecretManager) claimSecret(secret *corev1.Secret, owner client.Object, ownerIsController bool) error {
 	log := sm.log.WithValues("secret", secret.Name, "secretNamespace", secret.Namespace)
 	needsUpdate := false
 	if !metav1.HasLabel(secret.ObjectMeta, LabelEnvironmentName) {
@@ -105,12 +98,6 @@ func (sm *SecretManager) claimSecret(secret *corev1.Secret, owner client.Object,
 		}
 	}
 
-	if addFinalizer && !utils.StringInList(secret.Finalizers, SecretsFinalizer) {
-		log.Info("setting secret finalizer")
-		secret.Finalizers = append(secret.Finalizers, SecretsFinalizer)
-		needsUpdate = true
-	}
-
 	if needsUpdate {
 		if err := sm.client.Update(context.TODO(), secret); err != nil {
 			return errors.Wrap(err, fmt.Sprintf("failed to update secret %s in namespace %s", secret.ObjectMeta.Name, secret.ObjectMeta.Namespace))
@@ -124,12 +111,12 @@ func (sm *SecretManager) claimSecret(secret *corev1.Secret, owner client.Object,
 // will ensure it is present in the cache (and that we can watch for changes),
 // and optionally that it has a particular owner reference. The owner reference
 // may optionally be a controller reference.
-func (sm *SecretManager) obtainSecretForOwner(key types.NamespacedName, owner client.Object, ownerIsController, addFinalizer bool) (*corev1.Secret, error) {
+func (sm *SecretManager) obtainSecretForOwner(key types.NamespacedName, owner client.Object, ownerIsController bool) (*corev1.Secret, error) {
 	secret, err := sm.findSecret(key)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("failed to fetch secret %s in namespace %s", key.Name, key.Namespace))
 	}
-	err = sm.claimSecret(secret, owner, ownerIsController, addFinalizer)
+	err = sm.claimSecret(secret, owner, ownerIsController)
 
 	return secret, err
 }
@@ -138,37 +125,16 @@ func (sm *SecretManager) obtainSecretForOwner(key types.NamespacedName, owner cl
 // ensure it is present in the cache (and that we can watch for changes), and
 // that it has a particular owner reference. The owner reference may optionally
 // be a controller reference.
-func (sm *SecretManager) AcquireSecret(key types.NamespacedName, owner client.Object, ownerIsController, addFinalizer bool) (*corev1.Secret, error) {
+func (sm *SecretManager) AcquireSecret(key types.NamespacedName, owner client.Object, ownerIsController bool) (*corev1.Secret, error) {
 	if owner == nil {
 		panic("AcquireSecret called with no owner")
 	}
 
-	return sm.obtainSecretForOwner(key, owner, ownerIsController, addFinalizer)
+	return sm.obtainSecretForOwner(key, owner, ownerIsController)
 }
 
 // ObtainSecret retrieves a Secret and ensures that it has a label that will
 // ensure it is present in the cache (and that we can watch for changes).
 func (sm *SecretManager) ObtainSecret(key types.NamespacedName) (*corev1.Secret, error) {
-	return sm.obtainSecretForOwner(key, nil, false, false)
-}
-
-// ReleaseSecret removes secrets manager finalizer from specified secret when needed.
-func (sm *SecretManager) ReleaseSecret(secret *corev1.Secret) error {
-	if !utils.StringInList(secret.Finalizers, SecretsFinalizer) {
-		return nil
-	}
-
-	// Remove finalizer from secret to allow deletion
-	secret.Finalizers = utils.FilterStringFromList(
-		secret.Finalizers, SecretsFinalizer)
-
-	if err := sm.client.Update(context.Background(), secret); err != nil {
-		return errors.Wrap(err, fmt.Sprintf("failed to remove finalizer from secret %s in namespace %s",
-			secret.ObjectMeta.Name, secret.ObjectMeta.Namespace))
-	}
-
-	sm.log.Info("removed secret finalizer",
-		"remaining", secret.Finalizers)
-
-	return nil
+	return sm.obtainSecretForOwner(key, nil, false)
 }
diff --git a/tools/run_local_ironic.sh b/tools/run_local_ironic.sh
index a98ef86d..8e9e0ae7 100755
--- a/tools/run_local_ironic.sh
+++ b/tools/run_local_ironic.sh
@@ -203,13 +203,13 @@ fi
 # Start dnsmasq, http, mariadb, and ironic containers using same image
 
 # See this file for env vars you can set, like IP, DHCP_RANGE, INTERFACE
-# https://github.com/metal3-io/ironic-image/blob/master/scripts/rundnsmasq
+# https://github.com/metal3-io/ironic/blob/master/rundnsmasq.sh
 # shellcheck disable=SC2086
 sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name dnsmasq \
      ${POD} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
      -v "$IRONIC_DATA_DIR:/shared" --entrypoint /bin/rundnsmasq "${IRONIC_IMAGE}"
 
-# https://github.com/metal3-io/ironic-image/blob/master/scripts/runmariadb
+# https://github.com/metal3-io/ironic/blob/master/runmariadb.sh
 # shellcheck disable=SC2086
 sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name mariadb \
      ${POD} ${CERTS_MOUNTS} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
@@ -217,7 +217,7 @@ sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name mariadb \
      --env "MARIADB_PASSWORD=$mariadb_password" "${IRONIC_IMAGE}"
 
 # See this file for additional env vars you may want to pass, like IP and INTERFACE
-# https://github.com/metal3-io/ironic-image/blob/master/scripts/runironic-api
+# https://github.com/metal3-io/ironic/blob/master/runironic-api.sh
 # shellcheck disable=SC2086
 sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic-api \
      ${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD} \
@@ -227,7 +227,7 @@ sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic-api \
      -v "$IRONIC_DATA_DIR:/shared" "${IRONIC_IMAGE}"
 
 # See this file for additional env vars you may want to pass, like IP and INTERFACE
-# https://github.com/metal3-io/ironic-image/blob/master/scripts/runironic-conductor
+# https://github.com/metal3-io/ironic/blob/master/runironic-conductor.sh
 # shellcheck disable=SC2086
 sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic-conductor \
      ${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD} \


Test patch:
diff --git a/controllers/metal3.io/baremetalhost_controller_test.go b/controllers/metal3.io/baremetalhost_controller_test.go
index a755d2e2..6aa07159 100644
--- a/controllers/metal3.io/baremetalhost_controller_test.go
+++ b/controllers/metal3.io/baremetalhost_controller_test.go
@@ -10,7 +10,6 @@ import (
 	"testing"
 
 	"github.com/metal3-io/baremetal-operator/pkg/ironic/bmc"
-	"github.com/metal3-io/baremetal-operator/pkg/secretutils"
 
 	"github.com/stretchr/testify/assert"
 
@@ -443,15 +442,11 @@ func TestAddFinalizers(t *testing.T) {
 
 	tryReconcile(t, r, host,
 		func(host *metal3v1alpha1.BareMetalHost, result reconcile.Result) bool {
-			t.Logf("host finalizers: %v", host.ObjectMeta.Finalizers)
-			if !utils.StringInList(host.ObjectMeta.Finalizers, metal3v1alpha1.BareMetalHostFinalizer) {
-				return false
+			t.Logf("finalizers: %v", host.ObjectMeta.Finalizers)
+			if utils.StringInList(host.ObjectMeta.Finalizers, metal3v1alpha1.BareMetalHostFinalizer) {
+				return true
 			}
-
-			hostSecret := getHostSecret(t, r, host)
-			t.Logf("BMC secret finalizers: %v", hostSecret.ObjectMeta.Finalizers)
-
-			return utils.StringInList(hostSecret.ObjectMeta.Finalizers, secretutils.SecretsFinalizer)
+			return false
 		},
 	)
 }
@@ -1381,7 +1376,7 @@ func TestDeleteHost(t *testing.T) {
 
 			tryReconcile(t, r, host,
 				func(host *metal3v1alpha1.BareMetalHost, result reconcile.Result) bool {
-					return fix.Deleted && host == nil && !utils.StringInList(badSecret.Finalizers, secretutils.SecretsFinalizer)
+					return fix.Deleted && host == nil
 				},
 			)
 		})
@@ -2126,15 +2121,13 @@ func TestGetPreprovImageCreateUpdate(t *testing.T) {
 func TestGetPreprovImage(t *testing.T) {
 	host := newDefaultHost(t)
 	imageURL := "http://example.test/image.iso"
-	acceptFormats := []metal3v1alpha1.ImageFormat{metal3v1alpha1.ImageFormatISO, metal3v1alpha1.ImageFormatInitRD}
 	image := &metal3v1alpha1.PreprovisioningImage{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      host.Name,
 			Namespace: namespace,
 		},
 		Spec: metal3v1alpha1.PreprovisioningImageSpec{
-			Architecture:  "x86_64",
-			AcceptFormats: acceptFormats,
+			Architecture: "x86_64",
 		},
 		Status: metal3v1alpha1.PreprovisioningImageStatus{
 			Architecture: "x86_64",
@@ -2155,7 +2148,7 @@ func TestGetPreprovImage(t *testing.T) {
 	r := newTestReconciler(host, image)
 	i := makeReconcileInfo(host)
 
-	imgData, err := r.getPreprovImage(i, acceptFormats)
+	imgData, err := r.getPreprovImage(i, []metal3v1alpha1.ImageFormat{metal3v1alpha1.ImageFormatISO})
 	assert.NoError(t, err)
 	assert.NotNil(t, imgData)
 	assert.Equal(t, imageURL, imgData.ImageURL)
@@ -2211,8 +2204,7 @@ func TestPreprovImageAvailable(t *testing.T) {
 		{
 			Scenario: "ready no netdata",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:  "x86_64",
-				AcceptFormats: []metal3v1alpha1.ImageFormat{"iso", "initrd"},
+				Architecture: "x86_64",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
 				Architecture: "x86_64",
@@ -2234,7 +2226,6 @@ func TestPreprovImageAvailable(t *testing.T) {
 			Scenario: "ready",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
 				Architecture:    "x86_64",
-				AcceptFormats:   []metal3v1alpha1.ImageFormat{"iso", "initrd"},
 				NetworkDataName: "network_secret_1",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
@@ -2257,65 +2248,10 @@ func TestPreprovImageAvailable(t *testing.T) {
 			},
 			Available: true,
 		},
-		{
-			Scenario: "ready initrd",
-			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:    "x86_64",
-				AcceptFormats:   []metal3v1alpha1.ImageFormat{"initrd"},
-				NetworkDataName: "network_secret_1",
-			},
-			Status: metal3v1alpha1.PreprovisioningImageStatus{
-				Architecture: "x86_64",
-				Format:       "initrd",
-				NetworkData: metal3v1alpha1.SecretStatus{
-					Name:    "network_secret_1",
-					Version: "1000",
-				},
-				Conditions: []metav1.Condition{
-					{
-						Type:   string(metal3v1alpha1.ConditionImageReady),
-						Status: metav1.ConditionTrue,
-					},
-					{
-						Type:   string(metal3v1alpha1.ConditionImageError),
-						Status: metav1.ConditionFalse,
-					},
-				},
-			},
-			Available: true,
-		},
-		{
-			Scenario: "ready initrd fallback",
-			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:    "x86_64",
-				AcceptFormats:   []metal3v1alpha1.ImageFormat{"iso", "initrd"},
-				NetworkDataName: "network_secret_1",
-			},
-			Status: metal3v1alpha1.PreprovisioningImageStatus{
-				Architecture: "x86_64",
-				Format:       "initrd",
-				NetworkData: metal3v1alpha1.SecretStatus{
-					Name:    "network_secret_1",
-					Version: "1000",
-				},
-				Conditions: []metav1.Condition{
-					{
-						Type:   string(metal3v1alpha1.ConditionImageReady),
-						Status: metav1.ConditionTrue,
-					},
-					{
-						Type:   string(metal3v1alpha1.ConditionImageError),
-						Status: metav1.ConditionFalse,
-					},
-				},
-			},
-			Available: true,
-		},
 		{
 			Scenario: "ready secret outdated",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
 				Architecture:    "x86_64",
-				AcceptFormats:   []metal3v1alpha1.ImageFormat{"iso", "initrd"},
 				NetworkDataName: "network_secret_1",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
@@ -2342,7 +2278,6 @@ func TestPreprovImageAvailable(t *testing.T) {
 			Scenario: "ready secret mismatch",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
 				Architecture:    "x86_64",
-				AcceptFormats:   []metal3v1alpha1.ImageFormat{"iso", "initrd"},
 				NetworkDataName: "network_secret_1",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
@@ -2368,30 +2303,7 @@ func TestPreprovImageAvailable(t *testing.T) {
 		{
 			Scenario: "ready arch mismatch",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:  "aarch64",
-				AcceptFormats: []metal3v1alpha1.ImageFormat{"iso", "initrd"},
-			},
-			Status: metal3v1alpha1.PreprovisioningImageStatus{
-				Architecture: "x86_64",
-				Format:       "iso",
-				Conditions: []metav1.Condition{
-					{
-						Type:   string(metal3v1alpha1.ConditionImageReady),
-						Status: metav1.ConditionTrue,
-					},
-					{
-						Type:   string(metal3v1alpha1.ConditionImageError),
-						Status: metav1.ConditionFalse,
-					},
-				},
-			},
-			Available: false,
-		},
-		{
-			Scenario: "ready format mismatch",
-			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:  "x86_64",
-				AcceptFormats: []metal3v1alpha1.ImageFormat{"initrd"},
+				Architecture: "aarch64",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
 				Architecture: "x86_64",
@@ -2412,8 +2324,7 @@ func TestPreprovImageAvailable(t *testing.T) {
 		{
 			Scenario: "not ready",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:  "x86_64",
-				AcceptFormats: []metal3v1alpha1.ImageFormat{"iso", "initrd"},
+				Architecture: "x86_64",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
 				Architecture: "x86_64",
@@ -2434,8 +2345,7 @@ func TestPreprovImageAvailable(t *testing.T) {
 		{
 			Scenario: "failed",
 			Spec: metal3v1alpha1.PreprovisioningImageSpec{
-				Architecture:  "x86_64",
-				AcceptFormats: []metal3v1alpha1.ImageFormat{"iso", "initrd"},
+				Architecture: "x86_64",
 			},
 			Status: metal3v1alpha1.PreprovisioningImageStatus{
 				Architecture: "x86_64",
diff --git a/controllers/metal3.io/hostfirmwaresettings_test.go b/controllers/metal3.io/hostfirmwaresettings_test.go
index 667cb3e7..c87d5a0d 100644
--- a/controllers/metal3.io/hostfirmwaresettings_test.go
+++ b/controllers/metal3.io/hostfirmwaresettings_test.go
@@ -25,12 +25,12 @@ const (
 )
 
 var (
-	iTrue      = true
-	iFalse     = false
-	minLength  = 0
-	maxLength  = 20
-	lowerBound = 0
-	upperBound = 20
+	iTrue      bool = true
+	iFalse     bool = false
+	minLength  int  = 0
+	maxLength  int  = 20
+	lowerBound int  = 0
+	upperBound int  = 20
 )
 
 // Test support for HostFirmwareSettings in the HostFirmwareSettingsReconciler
diff --git a/pkg/ironic/bmc/access_test.go b/pkg/ironic/bmc/access_test.go
index a23f7275..f4df5c6b 100644
--- a/pkg/ironic/bmc/access_test.go
+++ b/pkg/ironic/bmc/access_test.go
@@ -3,8 +3,17 @@ package bmc
 import (
 	"reflect"
 	"testing"
+
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
+func init() {
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
+}
+
 func TestParse(t *testing.T) {
 	for _, tc := range []struct {
 		Scenario    string
@@ -1147,13 +1156,13 @@ func TestUnknownType(t *testing.T) {
 }
 
 func TestBuildBIOSCleanSteps(t *testing.T) {
-	var True = true
-	var False = false
+	var True bool = true
+	var False bool = false
 
 	cases := []struct {
 		name          string
 		address       string
-		firmware      *FirmwareConfig
+		firmware      *metal3v1alpha1.FirmwareConfig
 		expected      []map[string]string
 		expectedError bool
 	}{
@@ -1161,7 +1170,7 @@ func TestBuildBIOSCleanSteps(t *testing.T) {
 		{
 			name:    "ilo4",
 			address: "ilo4://192.168.122.1",
-			firmware: &FirmwareConfig{
+			firmware: &metal3v1alpha1.FirmwareConfig{
 				VirtualizationEnabled:             &True,
 				SimultaneousMultithreadingEnabled: &False,
 			},
@@ -1185,14 +1194,14 @@ func TestBuildBIOSCleanSteps(t *testing.T) {
 		{
 			name:     "ilo4, firmware is empty",
 			address:  "ilo4://192.168.122.1",
-			firmware: &FirmwareConfig{},
+			firmware: &metal3v1alpha1.FirmwareConfig{},
 			expected: nil,
 		},
 		// ilo5
 		{
 			name:    "ilo5",
 			address: "ilo5://192.168.122.1",
-			firmware: &FirmwareConfig{
+			firmware: &metal3v1alpha1.FirmwareConfig{
 				VirtualizationEnabled:             &True,
 				SimultaneousMultithreadingEnabled: &False,
 			},
@@ -1216,14 +1225,14 @@ func TestBuildBIOSCleanSteps(t *testing.T) {
 		{
 			name:     "ilo5, firmware is empty",
 			address:  "ilo5://192.168.122.1",
-			firmware: &FirmwareConfig{},
+			firmware: &metal3v1alpha1.FirmwareConfig{},
 			expected: nil,
 		},
 		// irmc
 		{
 			name:    "irmc",
 			address: "irmc://192.168.122.1",
-			firmware: &FirmwareConfig{
+			firmware: &metal3v1alpha1.FirmwareConfig{
 				VirtualizationEnabled:             &True,
 				SimultaneousMultithreadingEnabled: &False,
 			},
@@ -1247,7 +1256,7 @@ func TestBuildBIOSCleanSteps(t *testing.T) {
 		{
 			name:     "irmc, firmware is empty",
 			address:  "irmc://192.168.122.1",
-			firmware: &FirmwareConfig{},
+			firmware: &metal3v1alpha1.FirmwareConfig{},
 			expected: nil,
 		},
 	}
diff --git a/pkg/ironic/bmc/credentials_test.go b/pkg/ironic/bmc/credentials_test.go
index 02cf2ef0..3377c3ea 100644
--- a/pkg/ironic/bmc/credentials_test.go
+++ b/pkg/ironic/bmc/credentials_test.go
@@ -2,8 +2,15 @@ package bmc
 
 import (
 	"testing"
+
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	logz "sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
+func init() {
+	logf.SetLogger(logz.New(logz.UseDevMode(true)))
+}
+
 func TestValidCredentials(t *testing.T) {
 	creds := Credentials{
 		Username: "username",
diff --git a/pkg/ironic/raid_test.go b/pkg/ironic/raid_test.go
index 9692c634..6a2015dd 100644
--- a/pkg/ironic/raid_test.go
+++ b/pkg/ironic/raid_test.go
@@ -10,8 +10,8 @@ import (
 )
 
 func TestBuildTargetRAIDCfg(t *testing.T) {
-	var TRUE = true
-	var FALSE = false
+	var TRUE bool = true
+	var FALSE bool = false
 	cases := []struct {
 		name          string
 		raid          *metal3v1alpha1.RAIDConfig
diff --git a/pkg/ironic/testbmc/testbmc.go b/pkg/ironic/testbmc/testbmc.go
index 996e510c..ddbffd57 100644
--- a/pkg/ironic/testbmc/testbmc.go
+++ b/pkg/ironic/testbmc/testbmc.go
@@ -4,6 +4,8 @@ import (
 	"net/url"
 
 	"github.com/metal3-io/baremetal-operator/pkg/ironic/bmc"
+
+	metal3v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1"
 )
 
 func init() {
@@ -94,11 +96,7 @@ func (a *testAccessDetails) SupportsISOPreprovisioningImage() bool {
 	return false
 }
 
-func (a *testAccessDetails) RequiresProvisioningNetwork() bool {
-	return true
-}
-
-func (a *testAccessDetails) BuildBIOSSettings(firmwareConfig *bmc.FirmwareConfig) (settings []map[string]string, err error) {
+func (a *testAccessDetails) BuildBIOSSettings(firmwareConfig *metal3v1alpha1.FirmwareConfig) (settings []map[string]string, err error) {
 
 	// Return sample BMC data for test purposes
 	if firmwareConfig == nil {
diff --git a/pkg/provisioner/ironic/prepare_test.go b/pkg/provisioner/ironic/prepare_test.go
index 88b9074d..8f26e007 100644
--- a/pkg/provisioner/ironic/prepare_test.go
+++ b/pkg/provisioner/ironic/prepare_test.go
@@ -32,8 +32,7 @@ func (r *RAIDTestBMC) PowerInterface() string                                { r
 func (r *RAIDTestBMC) RAIDInterface() string                                 { return "" }
 func (r *RAIDTestBMC) VendorInterface() string                               { return "" }
 func (r *RAIDTestBMC) SupportsSecureBoot() bool                              { return false }
-func (r *RAIDTestBMC) RequiresProvisioningNetwork() bool                     { return true }
-func (r *RAIDTestBMC) BuildBIOSSettings(fwConf *bmc.FirmwareConfig) ([]map[string]string, error) {
+func (r *RAIDTestBMC) BuildBIOSSettings(fwConf *metal3v1alpha1.FirmwareConfig) ([]map[string]string, error) {
 	return nil, nil
 }
 
diff --git a/pkg/provisioner/ironic/provision_test.go b/pkg/provisioner/ironic/provision_test.go
index 0f139826..20c8a97c 100644
--- a/pkg/provisioner/ironic/provision_test.go
+++ b/pkg/provisioner/ironic/provision_test.go
@@ -402,8 +402,8 @@ func TestIronicHasSameImage(t *testing.T) {
 
 func TestBuildCleanSteps(t *testing.T) {
 
-	var True = true
-	var False = false
+	var True bool = true
+	var False bool = false
 
 	nodeUUID := "33ce8659-7400-4c68-9535-d10766f07a58"
 	cases := []struct {
diff --git a/pkg/provisioner/ironic/validatemanagementaccess_test.go b/pkg/provisioner/ironic/validatemanagementaccess_test.go
index 4b688e75..21c96e09 100644
--- a/pkg/provisioner/ironic/validatemanagementaccess_test.go
+++ b/pkg/provisioner/ironic/validatemanagementaccess_test.go
@@ -827,7 +827,7 @@ func TestPreprovisioningImageFormats(t *testing.T) {
 			Name:              "enabled ipmi",
 			Address:           "ipmi://example.test",
 			PreprovImgEnabled: true,
-			Expected:          []metal3v1alpha1.ImageFormat{"initrd"},
+			Expected:          nil,
 		},
 		{
 			Name:              "enabled virtualmedia",
@@ -978,7 +978,7 @@ func TestSetDeployImage(t *testing.T) {
 			},
 			ExpectBuild: false,
 			ExpectISO:   false,
-			ExpectPXE:   false,
+			ExpectPXE:   true,
 		},
 		{
 			Scenario: "pxe build no kernel",