diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4e84e02..f75de3e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,31 @@ Find changes for the upcoming release in the project's [changelog.d directory](h
+
+## 3.1.0 (2024-08-02)
+
+### New features
+
+- The database worker pod now deletes the records for all jobs that have passed their destruction times once per hour.
+- Restore support for execution duration and change the default execution duration back to 10 minutes. Use a very ugly hack to enforce a timeout in the backend worker that will hopefully not be too fragile.
+- Add support for aborting jobs.
+- Re-add the `CUTOUT_TIMEOUT` configuration option to change the default and maximum execution duration for cutout jobs.
+- Support pre-signed URLs returned by the backend worker. If the result URL is an `http` or `https` URL, pass it to the client unchanged.
+- Abort jobs on deletion or expiration if they are pending, queued, or executing.
+- Worker pods now wait for 30 seconds (UWS database workers) or 55 seconds (cutout workers) for jobs to finish on shutdown before cancelling them.
+
+### Bug fixes
+
+- Allow time durations in the configuration to be given in number of seconds as a string, which was accidentally broken in 3.0.0.
+- Restore support for automatically starting an async job by setting `phase=RUN` in the POST body. The equivalent query parameter was always supported, but POST body support was accidentally dropped in 3.0.0.
+- Add a colon after the error code and before the error message in error replies.
+- Stop setting `isPost` when returning UWS parameters. This undocumented field is supposed to only be set if the parameter contains a raw POST value rather than a regular parameter, which is never the case here.
+
+### Other changes
+
+- Stop upgrading the operating system packages in the worker image because the base image is so old that the package repositories no longer exist. This will hopefully be fixed in a future release of the Science Pipelines base image based on AlmaLinux.
+- Some XML output from UWS handlers is now handled by [vo-models](https://vo-models.readthedocs.io/latest/) instead of hand-written XML templates. More responses will hopefully be converted in the future.
+
## 3.0.0 (2024-06-28)
diff --git a/changelog.d/20240701_153719_david.irving_DM_45088.md b/changelog.d/20240701_153719_david.irving_DM_45088.md
deleted file mode 100644
index c08cffe..0000000
--- a/changelog.d/20240701_153719_david.irving_DM_45088.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Backwards-incompatible changes
-
-- Rolled back the base image for the backend worker due to a Butler bug that makes the new release unusable.
diff --git a/changelog.d/20240705_101725_rra_DM_45132.md b/changelog.d/20240705_101725_rra_DM_45132.md
deleted file mode 100644
index 3383bc1..0000000
--- a/changelog.d/20240705_101725_rra_DM_45132.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Other changes
-
-- Stop upgrading the operating system packages in the worker image because the base image is so old that the package repositories no longer exist. This will hopefully be fixed in a future release of the Science Pipelines base image based on AlmaLinux.
diff --git a/changelog.d/20240708_165945_rra_DM_45138.md b/changelog.d/20240708_165945_rra_DM_45138.md
deleted file mode 100644
index 7de796d..0000000
--- a/changelog.d/20240708_165945_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- The database worker pod now deletes the records for all jobs that have passed their destruction times once per hour.
diff --git a/changelog.d/20240709_104843_rra_DM_45138.md b/changelog.d/20240709_104843_rra_DM_45138.md
deleted file mode 100644
index d3ad352..0000000
--- a/changelog.d/20240709_104843_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Bug fixes
-
-- Add a colon after the error code and before the error message in error replies.
diff --git a/changelog.d/20240709_134925_david.irving_DM_44509.md b/changelog.d/20240709_134925_david.irving_DM_44509.md
deleted file mode 100644
index bd38680..0000000
--- a/changelog.d/20240709_134925_david.irving_DM_44509.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Backwards-incompatible changes
-
-- Upgrade the science pipelines stack to the latest weekly, for a new version of daf_butler that includes support for a new version of Butler server with a backwards-incompatible REST API.
\ No newline at end of file
diff --git a/changelog.d/20240710_144457_rra_DM_45138.md b/changelog.d/20240710_144457_rra_DM_45138.md
deleted file mode 100644
index 2ff84ed..0000000
--- a/changelog.d/20240710_144457_rra_DM_45138.md
+++ /dev/null
@@ -1,4 +0,0 @@
-### New features
-
-- Restore support for execution duration and change the default execution duration back to 10 minutes. Use a very ugly hack to enforce a timeout in the backend worker that will hopefully not be too fragile.
-- Re-add the `CUTOUT_TIMEOUT` configuration option to change the default and maximum execution duration for cutout jobs.
diff --git a/changelog.d/20240710_155859_rra_DM_45138.md b/changelog.d/20240710_155859_rra_DM_45138.md
deleted file mode 100644
index 524634a..0000000
--- a/changelog.d/20240710_155859_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Bug fixes
-
-- Allow time durations in the configuration to be given in number of seconds as a string, which was accidentally broken in 3.0.0.
diff --git a/changelog.d/20240711_135843_rra_DM_45138.md b/changelog.d/20240711_135843_rra_DM_45138.md
deleted file mode 100644
index bccd421..0000000
--- a/changelog.d/20240711_135843_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Add support for aborting jobs.
diff --git a/changelog.d/20240712_161212_rra_DM_45138.md b/changelog.d/20240712_161212_rra_DM_45138.md
deleted file mode 100644
index 27715d0..0000000
--- a/changelog.d/20240712_161212_rra_DM_45138.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### Bug fixes
-
-- Stop setting `isPost` when returning UWS parameters. This undocumented field is supposed to only be set if the parameter contains a raw POST value rather than a regular parameter, which is never the case here.
-
-### Other changes
-
-- Some XML output from UWS handlers is now handled by [vo-models](https://vo-models.readthedocs.io/latest/) instead of hand-written XML templates. More responses will hopefully be converted in the future.
diff --git a/changelog.d/20240715_143650_rra_DM_45138.md b/changelog.d/20240715_143650_rra_DM_45138.md
deleted file mode 100644
index 9fd152f..0000000
--- a/changelog.d/20240715_143650_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Support pre-signed URLs returned by the backend worker. If the result URL is an `http` or `https` URL, pass it to the client unchanged.
diff --git a/changelog.d/20240715_155338_rra_DM_45138.md b/changelog.d/20240715_155338_rra_DM_45138.md
deleted file mode 100644
index 6be1bc6..0000000
--- a/changelog.d/20240715_155338_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Bug fixes
-
-- Restore support for automatically starting an async job by setting `phase=RUN` in the POST body. The equivalent query parameter was always supported, but POST body support was accidentally dropped in 3.0.0.
diff --git a/changelog.d/20240715_164613_rra_DM_45138.md b/changelog.d/20240715_164613_rra_DM_45138.md
deleted file mode 100644
index 4efce70..0000000
--- a/changelog.d/20240715_164613_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Abort jobs on deletion or expiration if they are pending, queued, or executing.
diff --git a/changelog.d/20240715_170552_rra_DM_45138.md b/changelog.d/20240715_170552_rra_DM_45138.md
deleted file mode 100644
index cd26495..0000000
--- a/changelog.d/20240715_170552_rra_DM_45138.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Worker pods now wait for 30 seconds (UWS database workers) or 55 seconds (cutout workers) for jobs to finish on shutdown before cancelling them.