diff --git a/README.md b/README.md
index edb716a..92f0382 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
-# default-project-template
+# dishwasher-sim
-
+
-Find the project online at [projects.raspberrypi.org/en/projects/default-project-template](https://projects.raspberrypi.org/en/projects/default-project-template)
+Find the project online at [projects.raspberrypi.org/en/projects/dishwasher-sim](https://projects.raspberrypi.org/en/projects/dishwasher-sim)
## Resources
-For project materials and solutions, see [en/resources](https://github.com/raspberrypilearning/default-project-template/tree/master/en/resources) and [en/solutions](https://github.com/raspberrypilearning/default-project-template/tree/master/en/solutions).
+For project materials and solutions, see [en/resources](https://github.com/raspberrypilearning/dishwasher-sim/tree/master/en/resources) and [en/solutions](https://github.com/raspberrypilearning/dishwasher-sim/tree/master/en/solutions).
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md)
diff --git a/banner.png b/banner.png
index a6a80e0..dc348ac 100644
Binary files a/banner.png and b/banner.png differ
diff --git a/en/README.md b/en/README.md
index afbf6a7..ecaf6dd 100644
--- a/en/README.md
+++ b/en/README.md
@@ -1,96 +1,11 @@
-# Project Structure
+# Dishwasher simulator
-This repository is used to build CCP projects. Below is the directory structure and a description of what each folder and file is used for.
+This English project builds a Scratch dishwasher simulator from the starter project in `code/dishwasher-sim-starter`.
-```plaintext
-en/
-├── code/
-│ ├── project-name-complete/
-│ │ ├── main.py
-│ │ └── project_config.yml
-│ └── project-name-starter/
-│ ├── main.py
-│ └── project_config.yml
-├── images/
-│ └── .keep
-├── resources/
-│ └── .keep
-├── solutions/
-│ └── .keep
-├── README.md
-├── meta.yml
-├── step_1.md
-├── step_2.md
-└── step_3.md
-```
+## Project files
-## Directory and File Descriptions
-
-### `code/`
-Contains Python or HTML code used in the Raspberry Pi Code Editor.
-- Each project must be in its own subdirectory. Directory names should be descriptive but are otherwise flexible.
-- Inside each subdirectory:
- - `main.py` (for Python projects) or `index.html` (for HTML projects)
- - `project_config.yml` containing:
- - `name`: The project name
- - `identifier`: A unique identifier for the project
- - `type`: 'python' or 'html'
- - `build`: `false` by default; set to `true` for the editor project to be built
-
-### `images/`
-Stores all images for the project.
-- Must contain a `banner.png` (the project’s hero image).
-- Edited images should be accompanied by their original versions.
-- Additional supporting images should be sensibly named.
-
-### `resources/`
-Contains supporting resources for the project.
-- Must include the PDF version of the project, clearly named.
-- Other resources such as offline starter projects, assets, or supporting files can also go here.
-- Learners can download a `.zip` of this folder via:
- `https://rpf.io/p/en/project-slug-go`
-
-### `solutions/`
-Contains the final completed version of the project, if needed.
-- Learners can download this via:
- `https://rpf.io/p/en/project-slug-get`
-
-### `meta.yml`
-Defines project metadata used for publishing. Example fields:
-```yaml
-title: Project title in sentence case
-hero_image: images/banner.png
-description: A short description of the project
-listed: false
-pdf: false
-steps:
- - title: What you will make
- - title: Step title
- completion:
- - engaged
- - title: Step title
- completion:
- - internal
- - title: Challenge
- challenge: true
- completion:
- - external
-```
-
-- **`listed`**:
- - `true`: project is published from the master branch
- - `false`: project is not publicly listed (but still accessible via slug URL)
-- **`pdf`**: Path to a PDF in `resources/`, making it downloadable
-- **`completion`**: Metrics for learner progress
- - `engaged`: Learner has reached the first "making" step
- - `internal`: Final "making" step of the project
- - `external`: Last step of the project, often a challenge
-- **Challenges**: Optional, provide extra tasks and count as `external` completion steps
-
-### `README.md`
-Documentation for the project, including the structure and explanation of contents.
-
-### `step_1.md`, `step_2.md`, `step_3.md`
-Markdown files containing step-by-step instructions for learners.
-- Each step corresponds to a tutorial section.
-- The number of steps varies by project.
+- `code/dishwasher-sim-starter/` contains the starter `.sb3` with sprites, costumes, and sounds, but no variables, lists, or scripts.
+- `code/dishwasher-sim-complete/` contains the completed `.sb3` used as the reference project.
+- `solutions/` contains the completed `.sb3` for download.
+- `images/` contains learner-facing screenshots and asset examples used in the steps.
+- `step_1.md` to `step_9.md` contain the tutorial.
diff --git a/en/code/dishwasher-sim-complete/dishwasher-sim-complete.sb3 b/en/code/dishwasher-sim-complete/dishwasher-sim-complete.sb3
new file mode 100644
index 0000000..b4d1a0e
Binary files /dev/null and b/en/code/dishwasher-sim-complete/dishwasher-sim-complete.sb3 differ
diff --git a/en/code/dishwasher-sim-complete/project_config.yml b/en/code/dishwasher-sim-complete/project_config.yml
new file mode 100644
index 0000000..d6d0ad2
--- /dev/null
+++ b/en/code/dishwasher-sim-complete/project_config.yml
@@ -0,0 +1,4 @@
+name: "Dishwasher simulator completed"
+identifier: "dishwasher-sim-complete"
+type: 'scratch'
+build: false
diff --git a/en/code/dishwasher-sim-starter/dishwasher-sim-starter.sb3 b/en/code/dishwasher-sim-starter/dishwasher-sim-starter.sb3
new file mode 100644
index 0000000..e106d9c
Binary files /dev/null and b/en/code/dishwasher-sim-starter/dishwasher-sim-starter.sb3 differ
diff --git a/en/code/dishwasher-sim-starter/project_config.yml b/en/code/dishwasher-sim-starter/project_config.yml
new file mode 100644
index 0000000..f608bd0
--- /dev/null
+++ b/en/code/dishwasher-sim-starter/project_config.yml
@@ -0,0 +1,4 @@
+name: "Dishwasher simulator starter"
+identifier: "dishwasher-sim-starter"
+type: 'scratch'
+build: true
diff --git a/en/code/project-name-complete/main.py b/en/code/project-name-complete/main.py
deleted file mode 100644
index 7dc46d6..0000000
--- a/en/code/project-name-complete/main.py
+++ /dev/null
@@ -1 +0,0 @@
-print("Hello, world")
diff --git a/en/code/project-name-complete/project_config.yml b/en/code/project-name-complete/project_config.yml
deleted file mode 100644
index 9a71c8f..0000000
--- a/en/code/project-name-complete/project_config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-name: "Project title completed"
-identifier: "project-title-complete"
-type: 'python'
-build: false
diff --git a/en/code/project-name-starter/main.py b/en/code/project-name-starter/main.py
deleted file mode 100644
index 7dc46d6..0000000
--- a/en/code/project-name-starter/main.py
+++ /dev/null
@@ -1 +0,0 @@
-print("Hello, world")
diff --git a/en/code/project-name-starter/project_config.yml b/en/code/project-name-starter/project_config.yml
deleted file mode 100644
index dcc3f55..0000000
--- a/en/code/project-name-starter/project_config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-name: "Project title starter"
-identifier: "project-name-starter"
-type: 'python'
-build: false
diff --git a/en/images/banner.png b/en/images/banner.png
new file mode 100644
index 0000000..380062c
Binary files /dev/null and b/en/images/banner.png differ
diff --git a/en/images/bowl-cleaning-states.png b/en/images/bowl-cleaning-states.png
new file mode 100644
index 0000000..d1d2cce
Binary files /dev/null and b/en/images/bowl-cleaning-states.png differ
diff --git a/en/images/clean-plates.png b/en/images/clean-plates.png
new file mode 100644
index 0000000..7a69180
Binary files /dev/null and b/en/images/clean-plates.png differ
diff --git a/en/images/cloth-states.png b/en/images/cloth-states.png
new file mode 100644
index 0000000..6117147
Binary files /dev/null and b/en/images/cloth-states.png differ
diff --git a/en/images/copy-scripts.gif b/en/images/copy-scripts.gif
new file mode 100644
index 0000000..4ecdd97
Binary files /dev/null and b/en/images/copy-scripts.gif differ
diff --git a/en/images/dish-sprites.png b/en/images/dish-sprites.png
new file mode 100644
index 0000000..a75bd6d
Binary files /dev/null and b/en/images/dish-sprites.png differ
diff --git a/en/images/finished-project.png b/en/images/finished-project.png
new file mode 100644
index 0000000..2bdcad8
Binary files /dev/null and b/en/images/finished-project.png differ
diff --git a/en/images/music-volume.png b/en/images/music-volume.png
new file mode 100644
index 0000000..8fd530c
Binary files /dev/null and b/en/images/music-volume.png differ
diff --git a/en/images/rack.png b/en/images/rack.png
new file mode 100644
index 0000000..5abaca8
Binary files /dev/null and b/en/images/rack.png differ
diff --git a/en/images/skip-button.png b/en/images/skip-button.png
new file mode 100644
index 0000000..783df80
Binary files /dev/null and b/en/images/skip-button.png differ
diff --git a/en/images/soap.png b/en/images/soap.png
new file mode 100644
index 0000000..b7e5290
Binary files /dev/null and b/en/images/soap.png differ
diff --git a/en/images/spoon-cleaning-states.png b/en/images/spoon-cleaning-states.png
new file mode 100644
index 0000000..a2147ab
Binary files /dev/null and b/en/images/spoon-cleaning-states.png differ
diff --git a/en/landing.md b/en/landing.md
new file mode 100644
index 0000000..bdb0f84
--- /dev/null
+++ b/en/landing.md
@@ -0,0 +1,5 @@
+## What you will make
+
+You're going to build a **dishwasher simulator**. The player adds soap, scrubs a dirty dish until it sparkles, then drags it into the rack before the next dirty dish appears.
+
+
diff --git a/en/meta.yml b/en/meta.yml
index 911a8ca..8fb37ed 100644
--- a/en/meta.yml
+++ b/en/meta.yml
@@ -1,13 +1,23 @@
-title: Project title in sentence case
+title: Dishwasher simulator
hero_image: images/banner.png
-description: A short description of the project
+description: >-
+ Build a Scratch game where the player soaps, scrubs, and racks dirty dishes
+ one at a time.
listed: false
pdf: false
steps:
- title: What you will make
- - title: Step title
+ - title: Start the dishwasher
completion:
- - engaged
+ - engaged
+ - title: Add soap and a cloth
+ - title: Make one dish appear
+ - title: Scrub the dish
+ - title: Put it in the rack
+ - title: Copy the dish scripts
+ - title: Add music controls
+ completion:
+ - internal
- title: Challenge
challenge: true
completion:
diff --git a/en/solutions/Dishwasher simulator.sb3 b/en/solutions/Dishwasher simulator.sb3
new file mode 100644
index 0000000..b4d1a0e
Binary files /dev/null and b/en/solutions/Dishwasher simulator.sb3 differ
diff --git a/en/step_1.md b/en/step_1.md
index 9736879..09b10e5 100644
--- a/en/step_1.md
+++ b/en/step_1.md
@@ -1,45 +1,22 @@
## What you will make
-OR
-## What you will do - change meta if you use this
-A brief description - one or two sentences.
+You're going to build a **dishwasher simulator**. The player adds soap, scrubs a dirty dish until it sparkles, then drags it into the rack before the next dirty dish appears.
---- print-only ---
+> [!NOPRINT]
+>
+>
+>
+>
-
+> [!PRINTONLY]
+>
+> 
---- /print-only ---
+You will start with a Scratch project that already has the sprites, costumes, and sounds. You will create the variables and list as you build the code.
---- no-print ---
-
-[Editor embed](https://editor.raspberrypi.org/en/embed/viewer/project-slug)
-
---- /no-print ---
-
---- no-print ---
-
-Video embed
-
-
-
-Youtube embed
-
-
-
-
-
-
-Scratch embed
-
-
-
-
---- /no-print ---
+
### You will need:
-- a
-- b
-- c
+
+- The Scratch editor
+- The [Dishwasher simulator starter](https://scratch.mit.edu/projects/1362382639/editor){:target="_blank"} project
diff --git a/en/step_2.md b/en/step_2.md
index a55cafd..4dedfe0 100644
--- a/en/step_2.md
+++ b/en/step_2.md
@@ -1,8 +1,48 @@
-## Step title
+## Start the dishwasher
---- task ---
+Set up the game state, place the rack, and show the first dish.
+> [!TASK]
+>
+> Open the [Dishwasher simulator starter](https://scratch.mit.edu/projects/1362382639/editor){:target="_blank"}. It already has the sprites, costumes, and sounds you need.
---- /task ---
+> [!TASK]
+>
+> Click the `Stage`, then open the `Variables`{:class="block3variables"} blocks menu. Make these variables **for all sprites**:
+>
+> - `clean plates`{:class="block3variables"} stores the player's score. Leave this variable ticked so it appears on the Stage.
+> - `clean`{:class="block3variables"} remembers whether the current dish is clean. Untick this variable.
+> - `soap`{:class="block3variables"} remembers whether the player has picked up soap. Untick this variable.
+>
+>
+> [!TASK]
+>
+> Click the `Stage`. Add this script to reset the game and show the `bowl` first.
+>
+> ```blocks3
+> +when green flag clicked
+> +set [clean plates v] to (0)
+> +set [clean v] to [false]
+> +set [soap v] to [false]
+> +broadcast (bowl v)
+> ```
+> [!TASK]
+>
+> Click the `rack` sprite. It will be the target for clean dishes. Use a `when green flag clicked`{:class="block3events"} block to put it in the right place.
+>
+> The `rack` sprite is just a collision box. It looks plain because the drying rack the player sees is already drawn on the backdrop.
+>
+>
+>
+> ```blocks3
+> +when green flag clicked
+> +go to x: (140) y: (-38)
+> ```
+
+> [!TIP]
+>
+> In games, two sprites **collide** when they are touching. Later, a `touching ()?`{:class="block3sensing"} block will detect when a clean dish collides with the rack.
+
+Click the green flag. Nothing appears yet, but the score resets and the rack moves into place.
diff --git a/en/step_3.md b/en/step_3.md
index 3285a6d..9003f79 100644
--- a/en/step_3.md
+++ b/en/step_3.md
@@ -1,6 +1,139 @@
-## Challenge
+## Add soap and a cloth
---- task ---
+Make the soap clickable and make the cloth follow the pointer.
+> [!TASK]
+>
+> Click the `soap` sprite. Add code so the player can click the soap before they scrub a dish.
+>
+>
+>
+> ```blocks3
+> +when this sprite clicked
+> +start sound (Bubbles v)
+> +set [soap v] to [true]
+> ```
---- /task ---
+> [!TASK]
+>
+> Add another script to the `soap` sprite to make it sit behind the dishes.
+>
+> ```blocks3
+> +when green flag clicked
+> +set size to (25) %
+> +set drag mode [not draggable v]
+> +go to [back v] layer
+> ```
+
+> [!TASK]
+>
+> Add one more script to the `soap` sprite to make it pulse gently.
+>
+> ```blocks3
+> +when green flag clicked
+> +forever
+> +repeat (15)
+> +change size by (0.2)
+> end
+> +repeat (15)
+> +change size by (-0.2)
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Click the `cloth1` sprite. Make it follow the mouse pointer.
+>
+>
+>
+> ```blocks3
+> +when green flag clicked
+> +forever
+> +go to (mouse-pointer v)
+> +go to [front v] layer
+> end
+> ```
+
+> [!TASK]
+>
+> Add another script to the `cloth1` sprite. Start by showing the dry cloth.
+>
+> ```blocks3
+> +when green flag clicked
+> +forever
+> +switch costume to (cloth1 v)
+> end
+> ```
+
+> [!TASK]
+>
+> Replace the `switch costume to (cloth1 v)`{:class="block3looks"} block with an `if () then else`{:class="block3control"} block. Keep the dry cloth in the `else`{:class="block3control"} branch.
+>
+> ```blocks3
+> when green flag clicked
+> forever
+> +if <(clean) = [true]> then
+> else
+> switch costume to (cloth1 v)
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Add a `switch costume to ()`{:class="block3looks"} block inside the first branch to show the hand when the dish is clean.
+>
+> ```blocks3
+> when green flag clicked
+> forever
+> if <(clean) = [true]> then
+> +switch costume to (hand v)
+> else
+> switch costume to (cloth1 v)
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Inside the `else`{:class="block3control"}, add another `if () then else`{:class="block3control"} block to check whether the player has picked up soap. Keep the dry cloth in the new `else`{:class="block3control"} branch.
+>
+> ```blocks3
+> when green flag clicked
+> forever
+> if <(clean) = [true]> then
+> switch costume to (hand v)
+> else
+> +if <(soap) = [true]> then
+> else
+> switch costume to (cloth1 v)
+> end
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Add a `switch costume to ()`{:class="block3looks"} block inside the soap branch to show the soapy cloth.
+>
+> ```blocks3
+> when green flag clicked
+> forever
+> if <(clean) = [true]> then
+> switch costume to (hand v)
+> else
+> if <(soap) = [true]> then
+> +switch costume to (cloth2 v)
+> else
+> switch costume to (cloth1 v)
+> end
+> end
+> end
+> ```
+
+> [!TIP]
+>
+> **Visual feedback** shows the player that an action worked. Changing the cloth costume makes it clear when the player has picked up soap.
+
+Click the green flag and move the pointer. The cloth follows the pointer; when you click the soap, it changes to a soapy cloth.
diff --git a/en/step_4.md b/en/step_4.md
new file mode 100644
index 0000000..dcd81ba
--- /dev/null
+++ b/en/step_4.md
@@ -0,0 +1,70 @@
+## Make one dish appear
+
+Code the `bowl` first. Later, you will copy its scripts to the other dish sprites.
+
+> [!TASK]
+>
+> Click the `bowl_state_01_clean_sparkle` sprite. Add a `when green flag clicked`{:class="block3events"} block with a `hide`{:class="block3looks"} block.
+>
+> ```blocks3
+> +when green flag clicked
+> +hide
+> ```
+
+> [!TASK]
+>
+> Start another script with a `when I receive ()`{:class="block3events"} block and choose the `bowl` message. Set up the dirty bowl so it appears in the sink.
+>
+> ```blocks3
+> +when I receive (bowl v)
+> +switch costume to (bowl_state_06_filthy v)
+> +set [clean v] to [false]
+> +set size to (0) %
+> +go to x: (0) y: (-120)
+> +show
+> +set drag mode [not draggable v]
+> ```
+
+> [!TASK]
+>
+> Add a loop to the same script to make the bowl rise out of the sink.
+>
+> ```blocks3
+> when I receive (bowl v)
+> switch costume to (bowl_state_06_filthy v)
+> set [clean v] to [false]
+> set size to (0) %
+> go to x: (0) y: (-120)
+> show
+> set drag mode [not draggable v]
+> +repeat (20)
+> +change y by (6)
+> +change size by (6)
+> end
+> ```
+
+> [!TASK]
+>
+> Add blocks to the bottom of the same script to wait until the bowl is clean, then send the `clean` message.
+>
+> ```blocks3
+> when I receive (bowl v)
+> switch costume to (bowl_state_06_filthy v)
+> set [clean v] to [false]
+> set size to (0) %
+> go to x: (0) y: (-120)
+> show
+> set drag mode [not draggable v]
+> repeat (20)
+> change y by (6)
+> change size by (6)
+> end
+> +wait until <(clean) = [true]>
+> +broadcast (clean v)
+> ```
+
+The bowl starts tiny and grows as it rises out of the sink.
+
+> [!TASK]
+>
+> Click the green flag. The dirty bowl appears in the middle of the sink.
diff --git a/en/step_5.md b/en/step_5.md
new file mode 100644
index 0000000..10b1c8f
--- /dev/null
+++ b/en/step_5.md
@@ -0,0 +1,74 @@
+## Scrub the dish
+
+Make the player add soap, then scrub through the bowl's dirty-to-clean costumes.
+
+> [!TASK]
+>
+> The bowl has six costumes, from filthy to sparkling clean.
+>
+> 
+
+> [!TASK]
+>
+> Add this script to the `bowl_state_01_clean_sparkle` sprite. It checks whether the bowl still needs cleaning before it reacts to a click.
+>
+> ```blocks3
+> +when this sprite clicked
+> +if <(clean) = [false]> then
+> end
+> ```
+
+> [!TASK]
+>
+> Inside the `if () then`{:class="block3control"} block, tell the player what to do if they click the dirty bowl before picking up soap.
+>
+> ```blocks3
+> when this sprite clicked
+> if <(clean) = [false]> then
+> +say [You need soap!] for (2) seconds
+> +start sound (Collect v)
+> end
+> ```
+
+> [!TASK]
+>
+> Replace the two feedback blocks with an `if () then else`{:class="block3control"} block. Keep the feedback blocks in the `else`{:class="block3control"} branch for when the player has not picked up soap.
+>
+> ```blocks3
+> when this sprite clicked
+> if <(clean) = [false]> then
+> +if <(soap) = [true]> then
+> else
+> say [You need soap!] for (2) seconds
+> start sound (Collect v)
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Inside the `if <(soap) = [true]> then`{:class="block3control"} branch, add the blocks that scrub through the dirty-to-clean costumes.
+>
+> ```blocks3
+> when this sprite clicked
+> if <(clean) = [false]> then
+> if <(soap) = [true]> then
+> +repeat until <(costume [number v]) = (6)>
+> +wait until
+> +start sound (pick random (1) to (4))
+> +next costume
+> +wait (0.2) seconds
+> end
+> +set [clean v] to [true]
+> else
+> say [You need soap!] for (2) seconds
+> start sound (Collect v)
+> end
+> end
+> ```
+
+> [!TIP]
+>
+> The `repeat until`{:class="block3control"} loop stops when the bowl reaches costume `6`, the clean sparkling costume.
+
+Click the green flag, then click the bowl before using the soap. It tells you what it needs. Click the soap, then click and hold on the bowl to scrub it clean.
diff --git a/en/step_6.md b/en/step_6.md
new file mode 100644
index 0000000..66c63d3
--- /dev/null
+++ b/en/step_6.md
@@ -0,0 +1,39 @@
+## Put it in the rack
+
+Once the bowl is clean, let the player drag it into the rack and score a clean plate.
+
+> [!TASK]
+>
+> Add a `when I receive ()`{:class="block3events"} block to the `cloth1` sprite and choose the `clean` message.
+>
+> ```blocks3
+> +when I receive (clean v)
+> +say [Now put it in the rack!] for (2) seconds
+> ```
+
+> [!TASK]
+>
+> Add this script to the `bowl_state_01_clean_sparkle` sprite. It uses `set drag mode ()`{:class="block3sensing"} to unlock the clean bowl, then `wait until ()`{:class="block3control"} and `touching ()?`{:class="block3sensing"} to wait for the rack before starting the next round.
+>
+> ```blocks3
+> +when I receive (clean v)
+> +start sound (Coin v)
+> +set [soap v] to [false]
+> +set drag mode [draggable v]
+> +wait until
+> +repeat (60)
+> +change size by (-2)
+> end
+> +change [clean plates v] by (1)
+> +hide
+> +set size to (0) %
+> +go to x: (0) y: (-140)
+> +set [clean v] to [false]
+> +broadcast (bowl v)
+> ```
+
+> [!TASK]
+>
+> **Test:** Click the green flag, use the soap, scrub the bowl, then drag it into the rack.
+
+The bowl disappears, the `clean plates`{:class="block3variables"} score goes up, and a new bowl appears.
diff --git a/en/step_7.md b/en/step_7.md
new file mode 100644
index 0000000..0aaca85
--- /dev/null
+++ b/en/step_7.md
@@ -0,0 +1,87 @@
+## Copy the dish scripts
+
+Copy the bowl scripts to the other dish sprites, then edit the message and costume names.
+
+> [!TIP]
+>
+> Game developers often build and test one working **prototype** first. Fixing the bowl before copying its scripts makes problems easier to find.
+
+> [!TASK]
+>
+> Drag each of the four bowl scripts onto these other dish sprites:
+>
+> - `fork_state_01_clean_sparkle`
+> - `knife_state_01_clean_sparkle`
+> - `mug_state_01_clean_sparkle`
+> - `plate_state_01_clean_sparkle`
+> - `side_plate_state_01_clean_sparkle`
+> - `spoon_state_01_clean_sparkle`
+> - `tea_cup_state_01_clean_sparkle`
+>
+> 
+
+> [!TASK]
+>
+> On each copied sprite, edit the `when I receive (bowl v)`{:class="block3events"} block and the first `switch costume to ()`{:class="block3looks"} block.
+>
+> | Sprite | Receive message | Dirty costume |
+> | --- | --- | --- |
+> | `fork_state_01_clean_sparkle` | `fork` | `fork_state_06_filthy` |
+> | `knife_state_01_clean_sparkle` | `knife` | `knife_state_06_filthy` |
+> | `mug_state_01_clean_sparkle` | `mug` | `mug_state_06_filthy` |
+> | `plate_state_01_clean_sparkle` | `plate` | `plate_state_06_filthy` |
+> | `side_plate_state_01_clean_sparkle` | `sideplate` | `side_plate_state_06_filthy` |
+> | `spoon_state_01_clean_sparkle` | `spoon` | `spoon_state_06_filthy` |
+> | `tea_cup_state_01_clean_sparkle` | `teacup` | `tea_cup_state_06_filthy` |
+
+> [!TASK]
+>
+> Click the `Stage`. From the `Variables`{:class="block3variables"} blocks menu, choose **Make a List**. Make a list called `stuff`{:class="block3variables"} for all sprites.
+>
+> Add these eight items to the list, one item on each line:
+>
+> 1. `bowl`
+> 2. `fork`
+> 3. `knife`
+> 4. `mug`
+> 5. `plate`
+> 6. `sideplate`
+> 7. `spoon`
+> 8. `teacup`
+>
+> Untick the list so it does not appear on the Stage.
+
+> [!TASK]
+>
+> Click the `Stage`. Update the `when green flag clicked`{:class="block3events"} script so the game chooses a random item from the `stuff`{:class="block3variables"} list.
+>
+> ```blocks3
+> when green flag clicked
+> set [clean plates v] to (0)
+> set [clean v] to [false]
+> set [soap v] to [false]
+> +broadcast (item (pick random (1) to (8)) of [stuff v])
+> ```
+
+> [!TASK]
+>
+> Update the last `broadcast ()`{:class="block3events"} block in the clean script on the bowl and on each copied dish sprite, so the next item is random too.
+>
+> ```blocks3
+> when I receive (clean v)
+> start sound (Coin v)
+> set [soap v] to [false]
+> set drag mode [draggable v]
+> wait until
+> repeat (60)
+> change size by (-2)
+> end
+> change [clean plates v] by (1)
+> hide
+> set size to (0) %
+> go to x: (0) y: (-140)
+> set [clean v] to [false]
+> +broadcast (item (pick random (1) to (8)) of [stuff v])
+> ```
+
+Click the green flag and play a few rounds. Different dirty dishes appear after you put each clean one in the rack.
diff --git a/en/step_8.md b/en/step_8.md
new file mode 100644
index 0000000..d177073
--- /dev/null
+++ b/en/step_8.md
@@ -0,0 +1,250 @@
+## Add music controls
+
+Add background music and a button that skips to the next song.
+
+> [!TASK]
+>
+> Click the `Stage`, then make these variables **for all sprites** from the `Variables`{:class="block3variables"} blocks menu:
+>
+> - `song`{:class="block3variables"} stores which song is playing. Untick this variable.
+> - `music volume`{:class="block3variables"} stores how loud the music should be. Leave this variable ticked so it appears on the Stage.
+>
+>
+
+> [!TASK]
+>
+> On the Stage, double-click the `music volume`{:class="block3variables"} variable display until it changes into a slider. The player can drag the slider to change the music volume.
+
+> [!TASK]
+>
+> Click the `Stage`. Add the music setup blocks near the start of the `when green flag clicked`{:class="block3events"} script.
+>
+> ```blocks3
+> when green flag clicked
+> set [clean plates v] to (0)
+> set [clean v] to [false]
+> set [soap v] to [false]
+> +set [song v] to (pick random (1) to (3))
+> +set [music volume v] to (25)
+> +set volume to (music volume) %
+> +broadcast (play music v)
+> broadcast (item (pick random (1) to (8)) of [stuff v])
+> ```
+
+> [!TASK]
+>
+> Add another script to the `Stage` so the sound volume follows the `music volume`{:class="block3variables"} slider while the game runs.
+>
+> ```blocks3
+> +when green flag clicked
+> +forever
+> +set volume to (music volume) %
+> end
+> ```
+
+> [!TIP]
+>
+> Balancing the volume of music and sound effects is called **audio mixing**. Quieter music leaves room for the cleaning and scoring sounds.
+
+> [!TASK]
+>
+> Add a new script to the `Stage` with a `when I receive ()`{:class="block3events"} block and choose the `play music` message. Start with `song2` as the default song.
+>
+> ```blocks3
+> +when I receive (play music v)
+> +forever
+> +play sound (song2 v) until done
+> end
+> ```
+
+> [!TASK]
+>
+> Replace the `play sound (song2 v) until done`{:class="block3sound"} block with an `if () then else`{:class="block3control"} block. Keep `song2` in the `else`{:class="block3control"} branch.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> +if <(song) = (1)> then
+> else
+> play sound (song2 v) until done
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Add the `play sound () until done`{:class="block3sound"} block inside the first branch so `song1` can play.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> +play sound (song1 v) until done
+> else
+> play sound (song2 v) until done
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Inside the `else`{:class="block3control"}, add another `if () then else`{:class="block3control"} block so the script can choose between `song2` and `song3`. Keep `song2` in the first branch.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> play sound (song1 v) until done
+> else
+> +if <(song) = (2)> then
+> play sound (song2 v) until done
+> else
+> end
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Add the `play sound () until done`{:class="block3sound"} block inside the final `else`{:class="block3control"} branch so `song3` can play.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> play sound (song1 v) until done
+> else
+> if <(song) = (2)> then
+> play sound (song2 v) until done
+> else
+> +play sound (song3 v) until done
+> end
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Add a `change () by ()`{:class="block3variables"} block to the bottom of the `forever`{:class="block3control"} loop so the next song plays after the current song finishes.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> play sound (song1 v) until done
+> else
+> if <(song) = (2)> then
+> play sound (song2 v) until done
+> else
+> play sound (song3 v) until done
+> end
+> end
+> +change [song v] by (1)
+> end
+> ```
+
+> [!TASK]
+>
+> Add an `if () then`{:class="block3control"} block below the song change to check whether the song number has gone past `3`.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> play sound (song1 v) until done
+> else
+> if <(song) = (2)> then
+> play sound (song2 v) until done
+> else
+> play sound (song3 v) until done
+> end
+> end
+> change [song v] by (1)
+> +if <(song) > (3)> then
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Inside the `if () then`{:class="block3control"} block, reset the song number to `1`.
+>
+> ```blocks3
+> when I receive (play music v)
+> forever
+> if <(song) = (1)> then
+> play sound (song1 v) until done
+> else
+> if <(song) = (2)> then
+> play sound (song2 v) until done
+> else
+> play sound (song3 v) until done
+> end
+> end
+> change [song v] by (1)
+> if <(song) > (3)> then
+> +set [song v] to (1)
+> end
+> end
+> ```
+
+> [!TASK]
+>
+> Click the `skip` button sprite. Add a `broadcast ()`{:class="block3events"} block and choose the `skip` message. Set its drag mode to `not draggable`{:class="block3sensing"}.
+>
+>
+>
+> ```blocks3
+> +when this sprite clicked
+> +broadcast (skip v)
+> ```
+>
+> ```blocks3
+> +when green flag clicked
+> +set drag mode [not draggable v]
+> ```
+
+> [!TASK]
+>
+> Click the `Stage`. Add a `when I receive ()`{:class="block3events"} script for the `skip` message to stop the current song, move to the next song, and restart the music player.
+>
+> ```blocks3
+> +when I receive (skip v)
+> +stop [other scripts in sprite v]
+> +stop all sounds
+> +change [song v] by (1)
+> +broadcast (play music v)
+> ```
+
+> [!TASK]
+>
+> Add an `if () then`{:class="block3control"} block before the `broadcast ()`{:class="block3events"} block to check whether the song number has gone past `3`.
+>
+> ```blocks3
+> when I receive (skip v)
+> stop [other scripts in sprite v]
+> stop all sounds
+> change [song v] by (1)
+> +if <(song) > (3)> then
+> end
+> broadcast (play music v)
+> ```
+
+> [!TASK]
+>
+> Inside the `if () then`{:class="block3control"} block, reset the song number to `1`.
+>
+> ```blocks3
+> when I receive (skip v)
+> stop [other scripts in sprite v]
+> stop all sounds
+> change [song v] by (1)
+> if <(song) > (3)> then
+> +set [song v] to (1)
+> end
+> broadcast (play music v)
+> ```
+
+Click the green flag and clean dishes. The music plays, and the skip button changes the song.
+
+> [!SAVE]
diff --git a/en/step_9.md b/en/step_9.md
new file mode 100644
index 0000000..25b30f4
--- /dev/null
+++ b/en/step_9.md
@@ -0,0 +1,9 @@
+## Challenge
+
+Make the dishwasher simulator your own.
+
+> [!CHALLENGE]
+>
+> + Can you add a timer so the player tries to clean as many dishes as possible in one minute?
+> + Can you add a new dish sprite with six dirty-to-clean costumes and add its message to the `stuff`{:class="block3variables"} list?
+> + Can you make the game harder by making the dishes get dirty again if the player waits too long?