diff --git a/slides/k8s/prereqs-admin.md b/slides/k8s/prereqs-admin.md
deleted file mode 100644
index 2772d67f..00000000
--- a/slides/k8s/prereqs-admin.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Pre-requirements
-
-- Kubernetes concepts
-
- (pods, deployments, services, labels, selectors)
-
-- Hands-on experience working with containers
-
- (building images, running them; doesn't matter how exactly)
-
-- Familiar with the UNIX command-line
-
- (navigating directories, editing files, using `kubectl`)
-
----
-
-## Labs and exercises
-
-- We are going to build and break multiple clusters
-
-- Everyone will get their own private environment(s)
-
-- You are invited to reproduce all the demos (but you don't have to)
-
-- All hands-on sections are clearly identified, like the gray rectangle below
-
-.lab[
-
-- This is the stuff you're supposed to do!
-
-- Go to @@SLIDES@@ to view these slides
-
-
-
-]
-
----
-
-## Private environments
-
-- Each person gets their own private set of VMs
-
-- Each person should have a printed card with connection information
-
-- We will connect to these VMs with SSH
-
- (if you don't have an SSH client, install one **now!**)
-
----
-
-## Doing or re-doing this on your own?
-
-- We are using basic cloud VMs with Ubuntu LTS
-
-- Kubernetes [packages] or [binaries] have been installed
-
- (depending on what we want to accomplish in the lab)
-
-- We disabled IP address checks
-
- - we want to route pod traffic directly between nodes
-
- - most cloud providers will treat pod IP addresses as invalid
-
- - ... and filter them out; so we disable that filter
-
-[packages]: https://kubernetes.io/docs/setup/independent/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl
-
-[binaries]: https://kubernetes.io/docs/setup/release/notes/#server-binaries
diff --git a/slides/k8s/prereqs-advanced.md b/slides/k8s/prereqs-advanced.md
new file mode 100644
index 00000000..18996679
--- /dev/null
+++ b/slides/k8s/prereqs-advanced.md
@@ -0,0 +1,13 @@
+# Pre-requirements
+
+- Kubernetes concepts
+
+ (pods, deployments, services, labels, selectors)
+
+- Hands-on experience working with containers
+
+ (building images, running them; doesn't matter how exactly)
+
+- Familiarity with the UNIX command-line
+
+ (navigating directories, editing files, using `kubectl`)
diff --git a/slides/kadm-fullday.yml b/slides/kadm-fullday.yml
index ceda598b..9e6adf0b 100644
--- a/slides/kadm-fullday.yml
+++ b/slides/kadm-fullday.yml
@@ -27,7 +27,8 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
-
- - k8s/prereqs-admin.md
+ - k8s/prereqs-advanced.md
+ - shared/handson.md
- k8s/architecture.md
#- k8s/internal-apis.md
- k8s/deploymentslideshow.md
diff --git a/slides/kadm-twodays.yml b/slides/kadm-twodays.yml
index d459bdf8..6640624f 100644
--- a/slides/kadm-twodays.yml
+++ b/slides/kadm-twodays.yml
@@ -27,7 +27,8 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
# DAY 1
-- - k8s/prereqs-admin.md
+- - k8s/prereqs-advanced.md
+ - shared/handson.md
- k8s/architecture.md
- k8s/internal-apis.md
- k8s/deploymentslideshow.md
diff --git a/slides/kube-adv.yml b/slides/kube-adv.yml
index 1aae34d1..68cb59f9 100644
--- a/slides/kube-adv.yml
+++ b/slides/kube-adv.yml
@@ -25,7 +25,8 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
- #1
- - k8s/prereqs-admin.md
+ - k8s/prereqs-advanced.md
+ - shared/handson.md
- k8s/architecture.md
- k8s/internal-apis.md
- k8s/deploymentslideshow.md
diff --git a/slides/kube-fullday.yml b/slides/kube-fullday.yml
index 7e4540c2..04eda83d 100644
--- a/slides/kube-fullday.yml
+++ b/slides/kube-fullday.yml
@@ -27,6 +27,7 @@ content:
- shared/toc.md
-
- shared/prereqs.md
+ - shared/handson.md
#- shared/webssh.md
- shared/connecting.md
#- k8s/versions-k8s.md
diff --git a/slides/kube-halfday.yml b/slides/kube-halfday.yml
index 5d95c0f1..b22a1f99 100644
--- a/slides/kube-halfday.yml
+++ b/slides/kube-halfday.yml
@@ -28,6 +28,7 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
- - shared/prereqs.md
+ - shared/handson.md
#- shared/webssh.md
- shared/connecting.md
- k8s/versions-k8s.md
diff --git a/slides/kube-selfpaced.yml b/slides/kube-selfpaced.yml
index aaa97481..3e72697e 100644
--- a/slides/kube-selfpaced.yml
+++ b/slides/kube-selfpaced.yml
@@ -27,6 +27,7 @@ content:
- shared/toc.md
-
- shared/prereqs.md
+ - shared/handson.md
#- shared/webssh.md
- shared/connecting.md
- k8s/versions-k8s.md
diff --git a/slides/kube-twodays.yml b/slides/kube-twodays.yml
index bb2c4293..53a39e51 100644
--- a/slides/kube-twodays.yml
+++ b/slides/kube-twodays.yml
@@ -27,6 +27,7 @@ content:
- shared/toc.md
-
- shared/prereqs.md
+ - shared/handson.md
#- shared/webssh.md
- shared/connecting.md
#- k8s/versions-k8s.md
diff --git a/slides/shared/connecting.md b/slides/shared/connecting.md
index cb1b12c7..ee1307cd 100644
--- a/slides/shared/connecting.md
+++ b/slides/shared/connecting.md
@@ -68,7 +68,7 @@ class: in-person
Small setup effort; small cost; flexible environments
- Create a bunch of clusters for you and your friends
- ([instructions](https://@@GITREPO@@/tree/master/prepare-vms))
+ ([instructions](https://@@GITREPO@@/tree/main/prepare-labs))
Bigger setup effort; ideal for group training
diff --git a/slides/shared/handson.md b/slides/shared/handson.md
new file mode 100644
index 00000000..70c58283
--- /dev/null
+++ b/slides/shared/handson.md
@@ -0,0 +1,166 @@
+class: title
+
+*Tell me and I forget.*
+
+*Teach me and I remember.*
+
+*Involve me and I learn.*
+
+Misattributed to Benjamin Franklin
+
+[(Probably inspired by Chinese Confucian philosopher Xunzi)](https://www.barrypopik.com/index.php/new_york_city/entry/tell_me_and_i_forget_teach_me_and_i_may_remember_involve_me_and_i_will_lear/)
+
+---
+
+## Hands-on sections
+
+- There will be *a lot* of examples and demos
+
+- We are going to build, ship, and run containers (and sometimes, clusters!)
+
+- If you want, you can run all the examples and demos in your environment
+
+ (but you don't have to; it's up to you!)
+
+- All hands-on sections are clearly identified, like the gray rectangle below
+
+.lab[
+
+- This is a command that we're gonna run:
+ ```bash
+ echo hello world
+ ```
+
+]
+
+---
+
+class: in-person
+
+## Where are we going to run our containers?
+
+---
+
+class: in-person, pic
+
+
+
+---
+
+## If you're attending a live training or workshop
+
+- Each person gets a private lab environment
+
+ (depending on the scenario, this will be one VM, one cluster, multiple clusters...)
+
+- The instructor will tell you how to connect to your environment
+
+- Your lab environments will be available for the duration of the workshop
+
+ (check with your instructor to know exactly when they'll be shutdown)
+
+---
+
+## Running your own lab environments
+
+- If you are following a self-paced course...
+
+- Or watching a replay of a recorded course...
+
+- ...You will need to set up a local environment for the labs
+
+- If you want to deliver your own training or workshop:
+
+ - deployment scripts are available in the [prepare-labs] directory
+
+ - you can use them to automatically deploy many lab environments
+
+ - they support many different infrastructure providers
+
+[prepare-labs]: https://github.com/jpetazzo/container.training/tree/main/prepare-labs
+
+---
+
+class: in-person
+
+## Why don't we run containers locally?
+
+- Installing this stuff can be hard on some machines
+
+ (32 bits CPU or OS... Laptops without administrator access... etc.)
+
+- *"The whole team downloaded all these container images from the WiFi!
+
... and it went great!"* (Literally no-one ever)
+
+- All you need is a computer (or even a phone or tablet!), with:
+
+ - an Internet connection
+
+ - a web browser
+
+ - an SSH client
+
+---
+
+class: in-person
+
+## SSH clients
+
+- On Linux, OS X, FreeBSD... you are probably all set
+
+- On Windows, get one of these:
+
+ - [putty](http://www.putty.org/)
+ - Microsoft [Win32 OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH)
+ - [Git BASH](https://git-for-windows.github.io/)
+ - [MobaXterm](http://mobaxterm.mobatek.net/)
+
+- On Android, [JuiceSSH](https://juicessh.com/)
+ ([Play Store](https://play.google.com/store/apps/details?id=com.sonelli.juicessh))
+ works pretty well
+
+- Nice-to-have: [Mosh](https://mosh.org/) instead of SSH, if your Internet connection tends to lose packets
+
+---
+
+class: in-person, extra-details
+
+## What is this Mosh thing?
+
+*You don't have to use Mosh or even know about it to follow along.
+
+We're just telling you about it because some of us think it's cool!*
+
+- Mosh is "the mobile shell"
+
+- It is essentially SSH over UDP, with roaming features
+
+- It retransmits packets quickly, so it works great even on lossy connections
+
+ (Like hotel or conference WiFi)
+
+- It has intelligent local echo, so it works great even in high-latency connections
+
+ (Like hotel or conference WiFi)
+
+- It supports transparent roaming when your client IP address changes
+
+ (Like when you hop from hotel to conference WiFi)
+
+---
+
+class: in-person, extra-details
+
+## Using Mosh
+
+- To install it: `(apt|yum|brew) install mosh`
+
+- It has been pre-installed on the VMs that we are using
+
+- To connect to a remote machine: `mosh user@host`
+
+ (It is going to establish an SSH connection, then hand off to UDP)
+
+- It requires UDP ports to be open
+
+ (By default, it uses a UDP port between 60000 and 61000)
diff --git a/slides/shared/prereqs.md b/slides/shared/prereqs.md
index 7ed926fa..e04f29c3 100644
--- a/slides/shared/prereqs.md
+++ b/slides/shared/prereqs.md
@@ -17,153 +17,3 @@
(even if it's a `FROM` line and a couple of `RUN` commands)
- It's totally OK if you are not a Docker expert!
-
----
-
-class: title
-
-*Tell me and I forget.*
-
-*Teach me and I remember.*
-
-*Involve me and I learn.*
-
-Misattributed to Benjamin Franklin
-
-[(Probably inspired by Chinese Confucian philosopher Xunzi)](https://www.barrypopik.com/index.php/new_york_city/entry/tell_me_and_i_forget_teach_me_and_i_may_remember_involve_me_and_i_will_lear/)
-
----
-
-## Hands-on sections
-
-- The whole workshop is hands-on
-
-- We are going to build, ship, and run containers!
-
-- You are invited to reproduce all the demos
-
-- All hands-on sections are clearly identified, like the gray rectangle below
-
-.lab[
-
-- This is the stuff you're supposed to do!
-
-- Go to @@SLIDES@@ to view these slides
-
-
-
-]
-
----
-
-class: in-person
-
-## Where are we going to run our containers?
-
----
-
-class: in-person, pic
-
-
-
----
-
-class: in-person
-
-## You get a cluster of cloud VMs
-
-- Each person gets a private cluster of cloud VMs (not shared with anybody else)
-
-- They'll remain up for the duration of the workshop
-
-- You should have a little card with login+password+IP addresses
-
-- You can automatically SSH from one VM to another
-
-- The nodes have aliases: `node1`, `node2`, etc.
-
----
-
-class: in-person
-
-## Why don't we run containers locally?
-
-- Installing this stuff can be hard on some machines
-
- (32 bits CPU or OS... Laptops without administrator access... etc.)
-
-- *"The whole team downloaded all these container images from the WiFi!
-
... and it went great!"* (Literally no-one ever)
-
-- All you need is a computer (or even a phone or tablet!), with:
-
- - an Internet connection
-
- - a web browser
-
- - an SSH client
-
----
-
-class: in-person
-
-## SSH clients
-
-- On Linux, OS X, FreeBSD... you are probably all set
-
-- On Windows, get one of these:
-
- - [putty](http://www.putty.org/)
- - Microsoft [Win32 OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH)
- - [Git BASH](https://git-for-windows.github.io/)
- - [MobaXterm](http://mobaxterm.mobatek.net/)
-
-- On Android, [JuiceSSH](https://juicessh.com/)
- ([Play Store](https://play.google.com/store/apps/details?id=com.sonelli.juicessh))
- works pretty well
-
-- Nice-to-have: [Mosh](https://mosh.org/) instead of SSH, if your Internet connection tends to lose packets
-
----
-
-class: in-person, extra-details
-
-## What is this Mosh thing?
-
-*You don't have to use Mosh or even know about it to follow along.
-
-We're just telling you about it because some of us think it's cool!*
-
-- Mosh is "the mobile shell"
-
-- It is essentially SSH over UDP, with roaming features
-
-- It retransmits packets quickly, so it works great even on lossy connections
-
- (Like hotel or conference WiFi)
-
-- It has intelligent local echo, so it works great even in high-latency connections
-
- (Like hotel or conference WiFi)
-
-- It supports transparent roaming when your client IP address changes
-
- (Like when you hop from hotel to conference WiFi)
-
----
-
-class: in-person, extra-details
-
-## Using Mosh
-
-- To install it: `(apt|yum|brew) install mosh`
-
-- It has been pre-installed on the VMs that we are using
-
-- To connect to a remote machine: `mosh user@host`
-
- (It is going to establish an SSH connection, then hand off to UDP)
-
-- It requires UDP ports to be open
-
- (By default, it uses a UDP port between 60000 and 61000)
diff --git a/slides/swarm-fullday.yml b/slides/swarm-fullday.yml
index dba4b4e6..8477e36d 100644
--- a/slides/swarm-fullday.yml
+++ b/slides/swarm-fullday.yml
@@ -30,6 +30,7 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
- - shared/prereqs.md
+ - shared/handson.md
- shared/connecting.md
- swarm/versions.md
- shared/sampleapp.md
diff --git a/slides/swarm-halfday.yml b/slides/swarm-halfday.yml
index 3524d096..926d4867 100644
--- a/slides/swarm-halfday.yml
+++ b/slides/swarm-halfday.yml
@@ -30,6 +30,7 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
- - shared/prereqs.md
+ - shared/handson.md
- shared/connecting.md
- swarm/versions.md
- shared/sampleapp.md
diff --git a/slides/swarm-selfpaced.yml b/slides/swarm-selfpaced.yml
index da3b7532..0bd815d9 100644
--- a/slides/swarm-selfpaced.yml
+++ b/slides/swarm-selfpaced.yml
@@ -25,6 +25,7 @@ content:
#- shared/chat-room-zoom-webinar.md
- shared/toc.md
- - shared/prereqs.md
+ - shared/handson.md
- shared/connecting.md
- swarm/versions.md
- |
diff --git a/slides/swarm-video.yml b/slides/swarm-video.yml
index 209f9e58..9c34166a 100644
--- a/slides/swarm-video.yml
+++ b/slides/swarm-video.yml
@@ -21,6 +21,7 @@ content:
- shared/about-slides.md
- shared/toc.md
- - shared/prereqs.md
+ - shared/handson.md
- shared/connecting.md
- swarm/versions.md
- |