diff --git a/docs/user-guide/src/SUMMARY.md b/docs/user-guide/src/SUMMARY.md
index 8324be85..8aa39860 100644
--- a/docs/user-guide/src/SUMMARY.md
+++ b/docs/user-guide/src/SUMMARY.md
@@ -1,9 +1,11 @@
# Metal3 Project
+
[Introduction](introduction.md)
- [Project Overview]()
+- [Quick-start](quick-start.md)
- [Installing on Baremetal](baremetal/guide.md)
- [Baremetal Operator](bmo/introduction.md)
- [Install Baremetal Operator](bmo/install_baremetal_operator.md)
diff --git a/docs/user-guide/src/quick-start.md b/docs/user-guide/src/quick-start.md
new file mode 100644
index 00000000..6f0d4d91
--- /dev/null
+++ b/docs/user-guide/src/quick-start.md
@@ -0,0 +1,915 @@
+# Quick-start for Metal3
+
+This guide has been tested on Ubuntu server 22.04. It should be seen as an
+example rather than the absolute truth about how to deploy and use Metal3. We
+will cover two environments and two scenarios. The environments are
+
+1. a baremetal lab with actual physical servers and baseboard management
+ controllers (BMCs), and
+1. a virtualized baremetal lab with virtual machines and sushy-tools acting as
+ BMC.
+
+In both of these, we will show how to use Bare Metal Operator and Ironic to
+manage the servers through a Kubernetes API, as well as how to turn the servers
+into Kubernetes clusters managed through Cluster API. These are the two
+scenarios.
+
+In a nut-shell, this is what we will do:
+
+1. [Setup a management cluster](#management-cluster)
+1. [Setup a DHCP server](#dhcp-server)
+1. [Setup a disk image server](#image-server)
+1. [Deploy Ironic](#deploy-ironic)
+1. [Deploy Bare Metal Operator](#deploy-bare-metal-operator)
+1. [Create BareMetalHosts to represent the servers](#create-baremetalhosts)
+1. [(Scenario 1) Provision the BareMetalHosts](#scenario-1-provision-baremetalhosts)
+1. [(Scenario 2) Deploy Cluster API and turn the BareMetalHosts into a Kubernetes cluster](#scenario-2-metal3-and-cluster-api)
+
+## Prerequisites
+
+You will need the following tools installed.
+
+- docker (or podman)
+- kind or minikube (management cluster, not needed if you already have a "real"
+ cluster that you want to use)
+- clusterctl
+- kubectl
+- htpasswd
+- virsh and virt-install for the virtualized setup
+
+## Baremetal lab configuration
+
+The baremetal lab has two servers that we will call bml-01 and bml-02, as well
+as a management computer where we will set up Metal3. The servers are equipped
+with iLO 4 BMCs. These BMCs are connected to an "out of band" network
+(`192.168.1.0/24`) and they have the following IP addresses.
+
+- bml-01: 192.168.1.13
+- bml-02: 192.168.1.14
+
+There is a separate network for the servers (`192.168.0.0/24`). The management
+computer is connected to both of these networks with IP addresses `192.168.1.7`
+and `192.168.0.150` respectively.
+
+Finally, we will need the MAC addresses of the servers to keep track of which is
+which.
+
+- bml-01: 80:c1:6e:7a:e8:10
+- bml-02: 80:c1:6e:7a:5a:a8
+
+## Virtualized configuration
+
+If you do not have the hardware or perhaps just want to test things out without
+committing to a full baremetal lab, you may simulate it with virtual machines.
+In this section we will show how to create a virtual machine and use sushy-tools
+as a baseboard management controller for it.
+
+The configuration is a bit simpler than in the baremetal lab because we don't
+have a separate out of band network here. In the end we will have the BMC
+available as
+
+- bml-vm-01: 192.168.222.1:8000/redfish/v1/Systems/bmh-vm-01
+
+and the MAC address:
+
+- bml-vm-01: 00:60:2f:31:81:01
+
+Start by defining a libvirt network:
+
+```xml
+
+ baremetal
+
+
+
+
+
+
+
+
+
+```
+
+Save this as `net.xml`, define it and start it.
+
+```bash
+virsh -c qemu:///system net-define net.xml
+virsh -c qemu:///system net-start baremetal
+```
+
+Next, we will create a virtual machine. Feel free to adjust at as you see fit,
+but make sure to note the MAC address. That will be needed later. You can also
+create more than one if you like.
+
+```bash
+virt-install \
+ --connect qemu:///system \
+ --name bmh-vm-01 \
+ --description "Virtualized BareMetalHost" \
+ --osinfo=ubuntu-lts-latest \
+ --ram=4096 \
+ --vcpus=2 \
+ --disk size=25 \
+ --graphics=none \
+ --console pty \
+ --serial pty \
+ --pxe \
+ --network network=baremetal,mac="00:60:2f:31:81:01" \
+ --noautoconsole
+```
+
+### Sushy-tools - AKA the BMC
+
+Metal3 relies on baseboard management controllers to manage the baremetal
+servers, so we need something similar for our virtual machines. This comes in
+the form of [sushy-tools](https://docs.openstack.org/sushy/latest/).
+
+We need to create configuration file first:
+
+```conf
+# Listen on 192.168.222.1:8000
+SUSHY_EMULATOR_LISTEN_IP = u'192.168.222.1'
+SUSHY_EMULATOR_LISTEN_PORT = 8000
+# The libvirt URI to use. This option enables libvirt driver.
+SUSHY_EMULATOR_LIBVIRT_URI = u'qemu:///system'
+```
+
+```bash
+docker run --name sushy-tools --rm --network host -d \
+ -v /var/run/libvirt:/var/run/libvirt \
+ -v "$(pwd)/sushy-tools.conf:/etc/sushy/sushy-emulator.conf" \
+ -e SUSHY_EMULATOR_CONFIG=/etc/sushy/sushy-emulator.conf \
+ quay.io/metal3-io/sushy-tools:latest sushy-emulator
+```
+
+## Common setup
+
+This section is common for both the baremetal configuration and the virtualized
+environment. Specific configuration will always differ between environments
+though. We will go through how to configure and deploy Ironic and Baremetal
+Operator.
+
+### Management cluster
+
+If you already have a Kubernetes cluster that you want to use, go ahead and use
+that. Please ensure that it is connected to the relevant networks so that Ironic
+can reach the BMCs and so that the BareMetalHosts can reach Ironic.
+
+If you do not have an cluster already, you can create one using kind. Please
+note that this is absolutely not intended for production environments.
+
+We will use the following configuration file for kind, save it as `kind.yaml`:
+
+```yaml
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+nodes:
+- role: control-plane
+ # Open ports for Ironic
+ extraPortMappings:
+ # Ironic httpd
+ - containerPort: 6180
+ hostPort: 6180
+ listenAddress: "0.0.0.0"
+ protocol: TCP
+ # Ironic API
+ - containerPort: 6385
+ hostPort: 6385
+ listenAddress: "0.0.0.0"
+ protocol: TCP
+ # Inspector API
+ - containerPort: 5050
+ hostPort: 5050
+ listenAddress: "0.0.0.0"
+ protocol: TCP
+```
+
+As you can see, it has a few ports forwarded from the host. This is to make
+Ironic reachable when it is running inside the kind cluster.
+
+Now go ahead and create the cluster:
+
+```bash
+kind create cluster --config kind.yaml
+```
+
+We will need to install cert-manager also. It will be used to manage the
+certificates for Ironic later.
+
+```bash
+kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.3/cert-manager.yaml
+```
+
+### DHCP server
+
+The BareMetalHosts must be able to call back to Ironic when going through the
+inspection phase. This means that they must have IP addresses in a network where
+they can reach Ironic. We will set up a DHCP server for this purpose.
+
+Any DHCP server can be used for this. We will here use the Ironic container
+image that incudes dnsmasq and some scripts for configuring it.
+
+Create a configuration file and save it as `dnsmasq.env`.
+
+Baremetal lab:
+
+```bash
+# Specify the MAC addresses (separated by ;) of the hosts we know about and want to use
+DHCP_HOSTS=80:c1:6e:7a:e8:10;80:c1:6e:7a:5a:a8
+# Ignore unknown hosts so we don't accidentally give out IP addresses to other hosts in the network
+DHCP_IGNORE=tag:!known
+# Listen on this IP (management computer)
+PROVISIONING_IP=192.168.0.150
+# Give out IP addresses in this range
+DHCP_RANGE=192.168.0.100,192.168.0.149
+GATEWAY_IP=192.168.0.1
+```
+
+Virtualized environment:
+
+```bash
+DHCP_HOSTS=00:60:2f:31:81:01
+DHCP_IGNORE=tag:!known
+# IP of the host from VM perspective
+PROVISIONING_IP=192.168.222.1
+GATEWAY_IP=192.168.222.1
+DHCP_RANGE=192.168.222.100,192.168.222.149
+```
+
+You can now run the DHCP server like this:
+
+```bash
+docker run --name dnsmasq --rm -d --net=host --privileged --user 997:994 \
+ --env-file dnsmasq.env --entrypoint /bin/rundnsmasq \
+ quay.io/metal3-io/ironic
+```
+
+### Image server
+
+In order to do anything useful, we will need a server for hosting disk images
+that can be used to provision the servers.
+
+Create a directory to hold the disk images:
+
+```bash
+mkdir disk-images
+```
+
+Download images to use for testing (pick those that you want):
+
+```bash
+pushd disk-images
+wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
+wget https://cloud-images.ubuntu.com/jammy/current/SHA256SUMS
+sha256sum --ignore-missing -c SHA256SUMS
+wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2
+wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2.SHA256SUM
+sha256sum -c CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2.SHA256SUM
+wget https://artifactory.nordix.org/artifactory/metal3/images/k8s_v1.29.0/CENTOS_9_NODE_IMAGE_K8S_v1.29.0.qcow2
+sha256sum CENTOS_9_NODE_IMAGE_K8S_v1.29.0.qcow2
+popd
+```
+
+Run a basic http server to expose the disk images:
+
+```bash
+docker run --name image-server --rm -d -p 80:8080 \
+ -v "$(pwd)/disk-images:/usr/share/nginx/html" nginxinc/nginx-unprivileged
+```
+
+### Deploy Ironic
+
+In this section we will create a
+[kustomization](https://kubectl.docs.kubernetes.io/references/kustomize/glossary/#kustomization)
+containing configuration and credentials for deploying Ironic.
+
+Create a folder to hold the kustomization:
+
+```bash
+mkdir ironic
+```
+
+#### Authentication configuration
+
+Create authentication configuration for Ironic and Inspector. You will need to
+generate a username and password for each. We will here refer to them as
+`IRONIC_USERNAME`, `IRONIC_PASSWORD`, `INSPECTOR_USERNAME` and
+`INSPECTOR_PASSWORD`.
+
+Create a file `ironic-auth-config` with configuration for how to access Ironic.
+This will be use by Inspector. It should have the following content:
+
+```conf
+[ironic]
+auth_type=http_basic
+username=IRONIC_USERNAME
+password=IRONIC_PASSWORD
+```
+
+Create a file `ironic-inspector-auth-config` with configuration for how to
+access Inspector. This will be used by Ironic. It should have the following
+content:
+
+```conf
+[inspector]
+auth_type=http_basic
+username=INSPECTOR_USERNAME
+password=INSPECTOR_PASSWORD
+```
+
+To enable basic auth, we need to create secrets containing the keys
+`IRONIC_HTPASSWD` and `INSPECTOR_HTPASSWD` with values generated from the
+credentials using htpasswd. We will do this by creating two files
+`ironic-htpasswd` and `ironic-inspector-htpasswd` with the following content.
+
+`ironic-htpasswd`:
+
+```bash
+IRONIC_HTPASSWD="