diff --git a/common-content/en/module/js2/browser/index.md b/common-content/en/module/js2/browser/index.md
index a3faa5832..cb8b64399 100644
--- a/common-content/en/module/js2/browser/index.md
+++ b/common-content/en/module/js2/browser/index.md
@@ -17,6 +17,6 @@ emoji= '🧩'
User interfaces provide the gateway between a user and a complex application.
When navigating the internet, we continually interact with web pages to access data and interact with complex web applications.
-A {{}} provides a user interface to interact with web pages.{{}} is capable of fetching HTML documents from a server, and then rendering the document to create a user interface. If a user visits a website and gets a plain HTML document back, we say this content is static.
+A {{}} provides a user interface to interact with web pages.{{}} is capable of fetching HTML documents from a server, and then rendering the document to create a user interface. If every time a user visits a website, they get the same plain HTML document back, we say this content is static.
By static, we mean that the server's job was just to hand over the HTML document, and then the browser takes over. A user may interact with the browser's interface, e.g. to scroll, type in a text field, or drag-and-drop an image around, but this is done purely by interacting with the browser - the browser won't talk to the server about this.
diff --git a/common-content/en/module/js2/calculating/index.md b/common-content/en/module/js2/calculating/index.md
new file mode 100644
index 000000000..0f3674d12
--- /dev/null
+++ b/common-content/en/module/js2/calculating/index.md
@@ -0,0 +1,49 @@
++++
+title = '🧮 Calculating the remaining characters'
+
+time = 10
+facilitation = false
+emoji= '🧩'
+hide_from_overview = true
+[objectives]
+ 1='Access properties representing HTML attributes'
+[build]
+ render = 'never'
+ list = 'local'
+ publishResources = false
+
++++
+
+We want to implement Step 3: Calculate the number of characters left.
+
+Let's break down Step 3 into sub-goals:
+
+```mermaid
+flowchart TD
+A[Step 3.1: Get the character limit] --> B[Step 3.2: Get the number of characters already typed] --> C[Step 3.3: Subtract already typed from the limit]
+```
+
+## Getting information from the DOM
+
+We have seen that the DOM exposes live information about HTML elements in the page via properties on the objects it returns.
+
+We wrote `textarea.value` to get the characters already typed. This solves Step 3.2 - we can write `textarea.value.length`.
+
+We can also access the character limit, because it's defined as the `maxlength` attribute of the HTML textarea.
+
+In the Dev Tools console, if you type `textarea.max` you should see autocomplete for a property called `maxLength`.
+
+Most HTML attributes are exposed in the DOM as a property with the same name (but in camelCase). Let's try:
+
+```js
+console.log(textarea.maxLength)
+```
+
+Now that we have the character limit (from `textarea.maxLength`), and the number of characters already typed (from `textarea.value.length`):
+
+```js
+const remainingCharacters = textarea.maxLength - textarea.value.length;
+console.log(remainingCharacters);
+```
+
+Try typing in your textarea, then running this in the Dev Tools console.
diff --git a/common-content/en/module/js2/character-limit/index.md b/common-content/en/module/js2/character-limit/index.md
index 725f63bad..ca926d9a9 100644
--- a/common-content/en/module/js2/character-limit/index.md
+++ b/common-content/en/module/js2/character-limit/index.md
@@ -1,5 +1,5 @@
+++
-title = '🛑 Character limit'
+title = '🛑 Implenenting a character limit'
time = 20
facilitation = false
@@ -33,7 +33,12 @@ We can define _acceptance criteria_ for this component:
> _Given_ an textarea and a character limit of 200
> _When_ a user types characters into the textarea
-> _Then_ the interface should update with how many characters they've got left
+> _Then_ the interface should update with how many characters they've got left.
+
+> _Given_ an textarea and a character limit of 200
+> _When_ a user has already typed 200 characters into the textarea
+> _And_ the user tries to type another character
+> _Then_ the extra character should not get added to the textarea.
### 🏁 Starting point
@@ -50,8 +55,8 @@ In the user interface, we will start off with some static html: