diff --git a/modules/ch4-update/pages/s2-deltas-lab.adoc b/modules/ch4-update/pages/s2-deltas-lab.adoc
new file mode 100644
index 0000000..75bf976
--- /dev/null
+++ b/modules/ch4-update/pages/s2-deltas-lab.adoc
@@ -0,0 +1,336 @@
+:time_estimate: 11
+
+= Lab: Create And Publish Edge Image Updates
+
+_Estimated reading time: *{time_estimate} minutes*._
+
+Objective::
+
+Build RHEL for Edge image updates and publish them as OSTree deltas.
+
+WARNING: Work in Progress
+
+== Before you Begin
+
+You need a _development machine_ with RHEL and configured with the Image Builder service, its CLI and web UI, and a user that is member of the `weldr` group. Make sure your development machine was configured and verified by following the instructions from the xref:ch1-build:s4-install-lab.adoc[first lab].
+
+You also need a _web server machine_ which serves an OSTree repository. Make sure that machine was configured and verified by following the instructions from xref:ch2-publish:s2-ostree-lab.adoc[a previous lab].
+
+Finally, you need the _test VM_ that you created and published in xref:ch2-publish:s2-boot-lab.adoc[another lab].
+
+These instructions were tested on RHEL 9.4 [tentative!] but should work with minimal or no change on and newer and older RHEL 9.x releases.
+
+If you are using the course classroom, you will log in on the `workstation` VM as the user `student` with password `student`, and you start SSH sessions to the `servera` VM from the same user. In this case, the `workstation` VM is your _development machine_, and the `servera` VM is your _web server_ machine. If not, please adapt the instructions to your test environment.
+
+[ REVIEW NEXT PARA ]
+
+You will some steps in this lab on your _development machine_ and some steps on the _web server_ machine.
+
+[ Make one lab perform an update without a delta, and the other with a delta? ]
+
+== Instructions
+
+1. On your _development machine_, verify that you have the prerequisites from previous labs.
+
+.. Verify that the Image Builder service is active and that the current Linux user can submit requests to it.
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli status show*
+API server status:
+ Database version: 0
+ Database supported: true
+ Schema version: 0
+ API version: 1
+ Backend: osbuild-composer
+ Build: NEVRA:osbuild-composer-76-2.el9_2.x86_64
+...
+--
+
+.. Check that a remote client can access the OSTree repository in the web server machine.
++
+[source,subs="verbatim,quotes"]
+--
+$ *curl http://servera.lab.example.com/repo/config*
+[core]
+repo_version=1
+mode=archive-z2
+--
+
+.. Check that you can get the current commit ID the OSTree branch with the httpd edge system image that you created in xref:ch2-publish:s3-ostree-lab.adoc[a previous lab]. Your will get a different ID:
++
+[source,subs="verbatim,quotes"]
+--
+$ *curl http://servera.lab.example.com/repo/refs/heads/rhel/9/x86_64/edge*
+4afeda6a96ec8b2c263b6965a9c3f92db1db2436ae1e1233da70b7776fc6137b
+--
++
+Pay attention to the final path element of the URL, which should be "edge".
+
+.. Check that you can manage local VMs, and there's a VM left from the xref:s2-boot-lab:[previous lab] named `edge-test-1`.
++
+[source,subs="verbatim,quotes"]
+--
+$ *virsh list --all*
+ Id Name State
+---------------------------
+ 1 edge-test-1 shut-off
+ 2 edge-db-1 shut-off
+---
++
+It's fine the existing VM displays an status of "running" instead of "shut off".
+
+2. Make changes to the edge image blueprint to add a custom welcome page to the Apache Web Server.
+
+.. Open the `rhel9-httpd.toml` file which you created in a xref:ch1-build-blueprint-lab.adoc[previous lab], with any text editor.
+
+.. Increment the version number, in tbe beginning of the TOML file, and add a `customizations.file` section with an inline HTML page, to the end of the TOML file.
++
+[ didn't work, switch to adding the cockpit package ]
++
+[source,subs="verbatim,quotes"]
+--
+name = "rhel9-edge"
+description = "blueprint-rhel9-edge"
+version = "0.0.2"
+...
+[[customizations.files]]
+path = "/var/www/html/index.html"
+mode = "0644"
+user = "root"
+group = "root"
+data = """
+
+
+I am an Edge Device!
+
+
+"""--
+
+.. Push the updated blueprint.
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli push blueprints rhde-build-samples/blueprints/rhel9-httpd-v2.toml*
+--
+
+.. Verify that the blueprint in the Image Builder service contains your changes.
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli blueprints list*
+mysql-installer
+rhel9-edge
+rhel9-mysql
+$ *composer-cli blueprints show rhel9-edge*
+name = "rhel9-edge"
+description = "blueprint-rhel9-edge"
+version = "0.0.2"
+...
+--
+
+3. Still on your _development machine_, build an edge commit image from your changed blueprint.
+
+.. Start a compose for an edge commit image and copy its UUID to a shell variable.
++
+[ do I need a parent? looks like I have to reference the external repo ]
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli compose start-ostree rhel9-edge edge-commit --url http://servera.lab.example.com/repo --ref rhel/9/x86_64/edge*
+Compose fb5ef664-1def-4589-919d-1a0681f86371 added to the queue
+$ *UUID=fb5ef664-1def-4589-919d-1a0681f86371*
+--
+
+.. Wait until the compose finishes. To avoid clutter from previous labs, this time we filter the list of composes.
++
+[ try a better filter with jq. why can't I ask just the status of a given compose? :-() ]
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli compose list running*
+ID Status Blueprint Version Type
+fb5ef664-1def-4589-919d-1a0681f86371 RUNNING rhel9-edge 0.0.2 edge-commit
+$ *composer-cli compose list running*
+ID Status Blueprint Version Type
+$ *composer-cli compose list finished*
+ID Status Blueprint Version Type
+...
+fb5ef664-1def-4589-919d-1a0681f86371 FINISHED rhel9-edge 0.0.2 edge-commit
+--
+
+.. Download the edge commit image and copy it to your _web sever machine_.
++
+[source,subs="verbatim,quotes"]
+--
+$ *composer-cli compose image $UUID*
+fb5ef664-1def-4589-919d-1a0681f86371-commit.tar
+$ *scp $UUID-commit.tar servera:~*
+...
+--
+
+4. On your _web server machine_, copy the new edge image to the OSTree repository.
+
+.. Copy the shell variable with the UUID of the new edge commit image and check that it exists on your home folder.
++
+[source,subs="verbatim,quotes"]
+--
+$ *UUID=fb5ef664-1def-4589-919d-1a0681f86371*
+$ *ls $UUID-commit.tar*
+fb5ef664-1def-4589-919d-1a0681f86371-commit.tar
+--
+
+.. Extract the edge commit image and pull it into the OSTree repository.
++
+[source,subs="verbatim,quotes"]
+--
+$ *mkdir delete-me*
+$ *tar xf $UUID-commit.tar -C delete-me/*
+$ *sudo ostree pull-local --repo=/var/www/html/repo delete-me/repo*
+506 metadata, 1893 content objects imported; 0 bytes content written
+--
+
+.. Verify that the OSTree repo contains the same branch than your new edge commit image. The OSTree repo should contain additional branches.
++
+[source,subs="verbatim,quotes"]
+--
+$ *ostree refs --repo=delete-me/repo*
+rhel/9/x86_64/edge
+$ *ostree refs --repo=/var/www/html/repo*
+rhel/9/x86_64/edge
+rhel/9/x86_64/db
+--
+
+.. Verify that the OSTree repo contains the same commit than your new edge commit image.
++
+[ looks like my pull overwrote everything in the branch with the new commit and discarded the old one :-( ]
++
+[ do I fix this at build time or at pull time? looks like at build time ]
++
+[ parent must be 4afeda6a96ec8b2c263b6965a9c3f92db1db2436ae1e1233da70b7776fc6137b for consistency with previous labs ]
++
+[source,subs="verbatim,quotes"]
+--
+$ *ostree log rhel/9/x86_64/edge --repo=delete-me/repo*
+commit 4caef3752842366bbeab77b57b79854c6cb7bf4f2b62e82190cfba5d1cc3c12b
+Parent: 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+ContentChecksum: 94e275f4f9c9a9f68426ed9421845a48065467aea8bfcb57d826ed43fa50a253
+Date: 2024-10-09 22:43:27 +0000
+Version: 9.2
+(no subject)
+
+<< History beyond this commit not fetched >>
+$ *ostree log rhel/9/x86_64/edge --repo=/var/www/html/repo*
+commit 4caef3752842366bbeab77b57b79854c6cb7bf4f2b62e82190cfba5d1cc3c12b
+Parent: 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+ContentChecksum: 94e275f4f9c9a9f68426ed9421845a48065467aea8bfcb57d826ed43fa50a253
+Date: 2024-10-09 22:43:27 +0000
+Version: 9.2
+(no subject)
+
+commit 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+ContentChecksum: f938c449602ad38c31a74bd35f0e438beb833e8ca592c07c87ef90a56f659586
+Date: 2024-10-09 20:25:03 +0000
+Version: 9.2
+(no subject)
+
+--
+
+5. Now how do I get and apply the update to the test VM?
+
+
++
+[source,subs="verbatim,quotes"]
+--
+[core@edge ~]$ rpm-ostree status
+State: idle
+Deployments:
+● edge:rhel/9/x86_64/edge
+ Version: 9.2 (2024-10-09T20:25:03Z)
+ Commit: 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+[core@edge ~]$ sudo rpm-ostree upgrade --check
+2 metadata, 0 content objects fetched; 18 KiB transferred in 0 seconds; 0 bytes content written
+Note: --check and --preview may be unreliable. See https://github.com/coreos/rpm-ostree/issues/1579
+AvailableUpdate:
+ Version: 9.2 (2024-10-09T22:43:27Z)
+ Commit: 4caef3752842366bbeab77b57b79854c6cb7bf4f2b62e82190cfba5d1cc3c12b
+ Diff: 46 added
+[core@edge ~]$ sudo rpm-ostree upgrade
+[ 9130.645481] SELinux: Context system_u:object_r:cockpit_ws_exec_t:s0 is not valid (left unmapped).
+[ 9130.658824] SELinux: Context system_u:object_r:cockpit_session_exec_t:s0 is not valid (left unmapped).
+[ 9131.532015] SELinux: Context system_u:object_r:cockpit_unit_file_t:s0 is not valid (left unmapped).
+⠴ Receiving objects; 66% (1605/2400) 58.1 MB/s 116.3 MB 507 metadata, 1893 content objects fetched; 118645 KiB transferred in 3 seconds; 187.9 MB content written
+Receiving objects; 66% (1605/2400) 58.1 MB/s 116.3 MB... done
+Staging deployment... done
+Added:
+ adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch
+ cockpit-286.1-1.el9.x86_64
+...
+Run "systemctl reboot" to start a reboot
+$ systemctl reboot
+...
+boot messages
+...
+new login
+...
+[core@edge ~]$ rpm-ostree status
+State: idle
+Deployments:
+● edge:rhel/9/x86_64/edge
+ Version: 9.2 (2024-10-09T22:43:27Z)
+ Commit: 4caef3752842366bbeab77b57b79854c6cb7bf4f2b62e82190cfba5d1cc3c12b
+
+ edge:rhel/9/x86_64/edge
+ Version: 9.2 (2024-10-09T20:25:03Z)
+ Commit: 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+
+[core@edge ~]$ ostree log rhel/9/x86_64/edge
+commit 4caef3752842366bbeab77b57b79854c6cb7bf4f2b62e82190cfba5d1cc3c12b
+Parent: 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+ContentChecksum: 94e275f4f9c9a9f68426ed9421845a48065467aea8bfcb57d826ed43fa50a253
+Date: 2024-10-09 22:43:27 +0000
+Version: 9.2
+(no subject)
+
+commit 7ff678881e89e96c90eb083b905dce411740caf19c524481d7c1b848647b5746
+ContentChecksum: f938c449602ad38c31a74bd35f0e438beb833e8ca592c07c87ef90a56f659586
+Date: 2024-10-09 20:25:03 +0000
+Version: 9.2
+(no subject)
+
+[core@edge ~]$ rpm -q cockpit
+cockpit-286.1-1.el9.x86_64
+--
++
+Notice the bullet on rpm-ostree status to show which is the active deployment
+
+[ do static detlas now or later? ]
+
+[ I didn't do "ostreee summary -u" what is its purpose? ]
+
++
+[source,subs="verbatim,quotes"]
+--
+[core@edge ~]$ ostree remote refs edge
+error: Remote refs not available; server has no summary file
+
+after [student@servera ~]$ sudo ostree summary -u --repo=/var/www/html/repo
+
+[core@edge ~]$ ostree remote refs edge
+edge:rhel/9/x86_64/edge
+--
+
+[ with the edge-db VM, you need to configure a remote before applying updates ]
+
+[ there's rpm-ostree update, to get a newer commit of the same branch, and rpm-ostree rebase, to switch to a different branch which uses a different RHEL release ]
+
+
+[ to make a lab using the edge-db VM more interesting (instead of 90%+ the same as this) could configure automatic image updates
+But then we'd miss automatic rollbacks (greenboot) which I didn't put in scope here, this course is already too long
+ https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html-single/composing_installing_and_managing_rhel_for_edge_images/index#proc_upgrading-your-rhel-8-system-to-rhel-9_managing-rhel-for-edge-images ]
+
+[ After an update, grub shows two entries (new and old deployment) show it here or in the next lab with the db VM? ]
+
+[ should I start with an empty remote ostree repo and reference it since the first build? The way it is now, the first build is different than other builds. ]
+
+[ Use --filename to not have to deal with UUIDs? ]
\ No newline at end of file
diff --git a/modules/ch4-update/pages/section2.adoc b/modules/ch4-update/pages/section2.adoc
deleted file mode 100644
index 24f5686..0000000
--- a/modules/ch4-update/pages/section2.adoc
+++ /dev/null
@@ -1,3 +0,0 @@
-= Section 2
-
-This is _Section 2_ of _Chapter 3_ in the *hello* quick course....
\ No newline at end of file