diff --git a/java/README.md b/java/README.md
new file mode 100644
index 0000000..694dfde
--- /dev/null
+++ b/java/README.md
@@ -0,0 +1,23 @@
+# Show, Don't Tell — Java exercise workspace
+
+Java track for the "Show, Don't Tell — Using Examples with Coding Agents" exercise (Java 21 / Maven / JUnit 5 / AssertJ).
+
+## Prerequisites
+
+- Java 21 (Temurin) and Maven, versions pinned in `mise.toml`
+- If you use [mise](https://mise.jdx.dev): `mise install` installs both
+
+## Build and run the tests
+
+```sh
+mvn test
+```
+
+## Layout
+
+| Module | Contents |
+| --- | --- |
+| `order-domain`, `order-tests` | Order domain with discount behaviour, and its tests (Round 1) |
+| `order-book-domain`, `order-book-tests` | OrderBook state machine, and its integration tests (Round 2) |
+
+The exercise starts in its START state: all tests are green, the refactoring participants should do is NOT applied. The custom matcher example lives in `order-tests` (`OrderStateAssertion`).
diff --git a/java/mise.toml b/java/mise.toml
new file mode 100644
index 0000000..ddcb511
--- /dev/null
+++ b/java/mise.toml
@@ -0,0 +1,3 @@
+[tools]
+java = "temurin-21.0.9+10.0.LTS"
+maven = "3.9.16"
diff --git a/java/order-book-domain/pom.xml b/java/order-book-domain/pom.xml
new file mode 100644
index 0000000..2168561
--- /dev/null
+++ b/java/order-book-domain/pom.xml
@@ -0,0 +1,15 @@
+
+
+ 4.0.0
+
+
+ dev.learninghour.showdonttell
+ show-dont-tell-java
+ 1.0.0-SNAPSHOT
+
+
+ order-book-domain
+ jar
+
diff --git a/java/order-book-tests/pom.xml b/java/order-book-tests/pom.xml
new file mode 100644
index 0000000..820d5c1
--- /dev/null
+++ b/java/order-book-tests/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+
+ dev.learninghour.showdonttell
+ show-dont-tell-java
+ 1.0.0-SNAPSHOT
+
+
+ order-book-tests
+ jar
+
+
+
+ dev.learninghour.showdonttell
+ order-book-domain
+ ${project.version}
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.version}
+ test
+
+
+
diff --git a/java/order-domain/pom.xml b/java/order-domain/pom.xml
new file mode 100644
index 0000000..935916d
--- /dev/null
+++ b/java/order-domain/pom.xml
@@ -0,0 +1,15 @@
+
+
+ 4.0.0
+
+
+ dev.learninghour.showdonttell
+ show-dont-tell-java
+ 1.0.0-SNAPSHOT
+
+
+ order-domain
+ jar
+
diff --git a/java/order-tests/pom.xml b/java/order-tests/pom.xml
new file mode 100644
index 0000000..168db8e
--- /dev/null
+++ b/java/order-tests/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+
+ dev.learninghour.showdonttell
+ show-dont-tell-java
+ 1.0.0-SNAPSHOT
+
+
+ order-tests
+ jar
+
+
+
+ dev.learninghour.showdonttell
+ order-domain
+ ${project.version}
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
diff --git a/java/pom.xml b/java/pom.xml
new file mode 100644
index 0000000..2140662
--- /dev/null
+++ b/java/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ dev.learninghour.showdonttell
+ show-dont-tell-java
+ 1.0.0-SNAPSHOT
+ pom
+
+
+ order-domain
+ order-book-domain
+ order-tests
+ order-book-tests
+
+
+
+ UTF-8
+ 21
+ 5.14.4
+ 3.27.7
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.5.6
+
+
+
+