diff --git a/README.md b/README.md
index 14670054f8b55c1f6dd42304c819f2a07dc6c1dd..15fef6d8151c72b73c5abd4102171ba8990015f1 100644
--- a/README.md
+++ b/README.md
@@ -283,7 +283,7 @@ Instructions for testing
 
     - below LastPlayed, add:
 
-            "LaunchOptions" "~/.steam/steam/steamapps/common/SteamLinuxRuntime/pressure-vessel/bin/pressure-vessel-unruntime-test-ui -- %command%"
+            "LaunchOptions" "PRESSURE_VESSEL_WRAP_GUI=1 ~/.steam/steam/steamapps/common/SteamLinuxRuntime/pressure-vessel/bin/pressure-vessel-unruntime -- %command%"
 
     - restart Steam (on SteamOS use `sudo systemctl restart lightdm`)
 
@@ -309,39 +309,9 @@ Instructions for testing
 
     You can also choose to use the host system `/usr` directly.
 
-* For a more production-ready version without the test UI, set the launch
-    options to:
-
-        "LaunchOptions" "~/.steam/steam/steamapps/common/SteamLinuxRuntime/pressure-vessel/bin/pressure-vessel-unruntime-scout -- %command%"
-
-    This mode does not require Python 3, PyGI, GTK or a normal
-    window manager, and is probably more suitable for Big Picture mode.
-    It assumes this directory layout:
-
-    ```
-    SteamLinuxRuntime
-    \- pressure-vessel
-        \- bin
-            \- pressure-vessel-unruntime-scout (etc.)
-    \- scout
-        \- files
-        \- metadata
-    ```
-
-    Or for more flexibility, use
-
-        "LaunchOptions" "~/.steam/steam/steamapps/common/SteamLinuxRuntime/pressure-vessel/bin/pressure-vessel-unruntime -- %command%"
-
-    and then add more options just before the `--` as desired.
-    This mode does not require Python 3, PyGI, GTK or a normal
-    window manager, and is probably more suitable for Big Picture mode.
-
 * The default runtime for `pressure-vessel-unruntime` is the host system,
     with the `LD_LIBRARY_PATH` Steam Runtime overlaid onto it.
-    You can specify a runtime with the `--runtime` option:
-    `pressure-vessel-unruntime-scout` is just a shortcut for using
-    `pressure-vessel-unruntime --runtime DIR/../../scout/files` where *DIR*
-    is the directory containing `pressure-vessel-unruntime-scout` itself.
+    You can specify a runtime with the `--runtime` option.
 
     The runtime can be any of these:
 
@@ -474,7 +444,7 @@ configured.
 
 ### More options
 
-Use `pressure-vessel-unruntime` or `pressure-vessel-unruntime-test-ui`
+Use `pressure-vessel-unruntime`
 if you are in a Steam Runtime environment (the Steam Runtime's `run.sh`
 or a Steam game), and `pressure-vessel-wrap` or `pressure-vessel-test-ui`
 if you are not ("Add non-Steam game" in Steam, or a non-Steam-related
diff --git a/build-relocatable-install.py b/build-relocatable-install.py
index 51be981e594c9d8d0ddcebb141b78cf81f973e92..1444627e8da86eb4fb83844e005306a31b32dc1f 100755
--- a/build-relocatable-install.py
+++ b/build-relocatable-install.py
@@ -104,8 +104,6 @@ SCRIPTS = [
     'pressure-vessel-locale-gen',
     'pressure-vessel-test-ui',
     'pressure-vessel-unruntime',
-    'pressure-vessel-unruntime-scout',
-    'pressure-vessel-unruntime-test-ui',
 ]
 EXECUTABLES = [
     'pressure-vessel-adverb',
diff --git a/man/adverb.1.md b/man/adverb.1.md
new file mode 100644
index 0000000000000000000000000000000000000000..231a60305d483bff4800797e1dfd5e777404aad2
--- /dev/null
+++ b/man/adverb.1.md
@@ -0,0 +1,213 @@
+---
+title: pressure-vessel-adverb
+section: 1
+...
+
+# NAME
+
+pressure-vessel-adverb - wrap processes in various ways
+
+# SYNOPSIS
+
+**pressure-vessel-adverb**
+[**--[no-]exit-with-parent**]
+[**--fd** *FD*...]
+[**--[no-]generate-locales**]
+[**--pass-fd** *FD*...]
+[**--subreaper**]
+[**--terminate-timeout** *SECONDS* [**--terminate-idle-timeout** *SECONDS*]]
+[[**--[no-]create**]
+[**--[no-]wait**]
+[**--[no-]write**]
+**--lock-file** *FILENAME*...]
+[**--verbose**]
+[**--**]
+*COMMAND* [*ARGUMENTS...*]
+
+# DESCRIPTION
+
+**pressure-vessel-adverb** runs *COMMAND* as a child process, with
+modifications to its execution environment as determined by the options.
+
+By default, it just runs *COMMAND* as a child process and reports its
+exit status.
+
+# OPTIONS
+
+**--create**
+:   Create each **--lock-file** that appears on the command-line after
+    this option if it does not exist, until a **--no-create** option
+    is seen. **--no-create** reverses this behaviour, and is the default.
+
+**--exit-with-parent**
+:   Arrange for **pressure-vessel-adverb** to receive **SIGTERM**
+    (which it will pass on to *COMMAND*, if possible) when its parent
+    process exits. This is particularly useful when it is wrapped in
+    **bwrap** by **pressure-vessel-wrap**, to arrange for the
+    **pressure-vessel-adverb** command to exit when **bwrap** is killed.
+    **--no-exit-with-parent** disables this behaviour, and is the default.
+
+**--fd** *FD*
+:   Receive file descriptor *FD* (specified as a small positive integer)
+    from the parent process, and keep it open until
+    **pressure-vessel-adverb** exits. This is most useful if *FD*
+    is locked with a Linux open file description lock (**F_OFD_SETLK**
+    or **F_OFD_SETLKW** from **fcntl**(2)), in which case the lock will
+    be held by **pressure-vessel-adverb**.
+
+**--generate-locales**
+:   If not all configured locales are available, generate them in a
+    temporary directory which is passed to the *COMMAND* in the
+    **LOCPATH** environment variable.
+    **--no-generate-locales** disables this behaviour, and is the default.
+
+**--lock-file** *FILENAME*
+:   Lock the file *FILENAME* according to the most recently seen
+    **--[no-]create**, **--[no-]wait** and **--[no-]write** options,
+    using a Linux open file description lock (**F_OFD_SETLK** or
+    **F_OFD_SETLKW** from **fcntl**(2)) if possible, or a POSIX
+    process-associated record lock (**F_SETLK** or **F_SETLKW**) on older
+    kernels.
+
+**--pass-fd** *FD*
+:   Pass the file descriptor *FD* (specified as a small positive integer)
+    from the parent process to the *COMMAND*. The default is to only pass
+    through file descriptors 0, 1 and 2
+    (**stdin**, **stdout** and **stderr**).
+
+**--subreaper**
+:   If the *COMMAND* starts background processes, arrange for them to
+    be reparented to **pressure-vessel-adverb** instead of to **init**
+    when their parent process exits, and do not exit until all such
+    descendant processes have exited.
+    A non-negative **--terminate-timeout** implies this option.
+
+**--terminate-idle-timeout** *SECONDS*
+:   If a non-negative **--terminate-timeout** is specified, wait this
+    many seconds before sending **SIGTERM** to child processes.
+    Non-integer decimal values are allowed.
+    0 or negative means send **SIGTERM** immediately, which is the
+    default.
+    This option is ignored if **--terminate-timeout** is not used.
+
+**--terminate-timeout** *SECONDS*
+:   If non-negative, terminate background processes after the *COMMAND*
+    exits. This implies **--subreaper**.
+    Non-integer decimal values are allowed.
+    When this option is enabled, after *COMMAND* exits,
+    **pressure-vessel-adverb** will wait for up to the time specified
+    by **--terminate-idle-timeout**, then send **SIGTERM** to any
+    remaining child processes and wait for them to exit gracefully.
+    If child processes continue to run after a further time specified
+    by this option, send **SIGKILL** to force them to be terminated,
+    and continue to send **SIGKILL** until there are no more descendant
+    processes. If *SECONDS* is 0, **SIGKILL** is sent immediately.
+    A negative number means signals are not sent, which is the default.
+
+**--verbose**
+:   Be more verbose.
+
+**--wait**
+:   For each **--lock-file** that appears on the command-line after
+    this option until a **--no-wait** option is seen, if the file is
+    already locked in an incompatible way, **pressure-vessel-adverb**
+    will wait for the current holder of the lock to release it.
+    With **--no-wait**, which is the default, **pressure-vessel-adverb**
+    will exit with status 75 (**EX_TEMPFAIL**) if a lock cannot be acquired.
+
+**--write**
+:   Each **--lock-file** that appears on the command-line after
+    this option will be locked in **F_WRLCK** mode (an exclusive/write
+    lock), until a **--no-write** option is seen. **--no-write** results
+    in use of **F_RDLCK** (a shared/read lock), and is the default.
+
+# OUTPUT
+
+The standard output from *COMMAND* is printed on standard output.
+
+The standard error from *COMMAND* is printed on standard error.
+Diagnostic messages from **pressure-vessel-adverb** may also be printed
+on standard error.
+
+# SIGNALS
+
+If **pressure-vessel-adverb** receives signals **SIGHUP**, **SIGINT**,
+**SIGQUIT**, **SIGTERM**, **SIGUSR1** or **SIGUSR2**, it immediately
+sends the same signal to *COMMAND*, hopefully causing *COMMAND* to
+exit gracefully.
+
+# EXIT STATUS
+
+Nonzero (failure) exit statuses are subject to change, and might be
+changed to be more like **env**(1) in future.
+
+0
+:   The *COMMAND* exited successfully with status 0
+
+1
+:   An error occurred while setting up the execution environment or
+    starting the *COMMAND*
+
+64 (**EX_USAGE**)
+:   Invalid arguments were given
+
+69 (**EX_UNAVAILABLE**)
+:   An error occurred while setting up the execution environment
+
+70 (**EX_SOFTWARE**)
+:   The *COMMAND* terminated in an unknown way
+
+75 (**EX_TEMPFAIL**)
+:   A **--lock-file** could not be acquired, and **--wait** was not given
+
+127
+:   The *COMMAND* could not be started
+
+Any value 1-255
+:   The *COMMAND* exited unsuccessfully with the status indicated
+
+128 + *n*
+:   The *COMMAND* was killed by signal *n*
+    (this is the same encoding used by **bash**(1), **bwrap**(1) and
+    **env**(1))
+
+# EXAMPLE
+
+When running a game in a container as a single command,
+**pressure-vessel-wrap** uses a pattern similar to:
+
+    bwrap \
+        ... \
+    /path/to/pressure-vessel-adverb \
+        --exit-with-parent \
+        --generate-locales \
+        --lock-file=/path/to/runtime/.ref \
+        --subreaper \
+        -- \
+    /path/to/game ...
+
+to preserve Steam's traditional behaviour for native Linux games (where
+all background processes must exit before the game is considered to have
+exited).
+
+When running **pressure-vessel-launcher** in a container, the adverb looks
+more like this:
+
+    bwrap \
+        ... \
+    /path/to/pressure-vessel-adverb \
+        --exit-with-parent \
+        --generate-locales \
+        --lock-file=/path/to/runtime/.ref \
+        --subreaper \
+        --terminate-timeout=10 \
+        -- \
+    /path/to/pressure-vessel-launcher ...
+
+so that when the **pressure-vessel-launcher** is terminated by
+**pressure-vessel-launch --terminate**, or when the **bwrap** process
+receives a fatal signal, the **pressure-vessel-adverb** process will
+gracefully terminate any remaining child/descendant processes before
+exiting itself.
+
+<!-- vim:set sw=4 sts=4 et: -->
diff --git a/man/launch.1.md b/man/launch.1.md
index bc5aaa4a18af7c2fb338170b4a2a80ef54675cdf..9eb38f7ed719d984212bba670d60b03093cb7242 100644
--- a/man/launch.1.md
+++ b/man/launch.1.md
@@ -155,6 +155,8 @@ Any value less than 128
 
 128 + *n*
 :   The *COMMAND* was killed by signal *n*.
+    (This is the same encoding used by **bash**(1), **bwrap**(1) and
+    **env**(1).)
 
 # EXAMPLES
 
diff --git a/man/locale-gen.1.md b/man/locale-gen.1.md
index b8f500c362e3fd2a661483b497b61336ed858393..c21d9966c665da028b56d63edc3ae3551a585184 100644
--- a/man/locale-gen.1.md
+++ b/man/locale-gen.1.md
@@ -9,21 +9,27 @@ pressure-vessel-locale-gen - generate additional locales
 
 # SYNOPSIS
 
-**pressure-vessel-locale-gen** [*LOCALE*…]
+**pressure-vessel-locale-gen**
+[**--output-directory** *DIR*]
+[*LOCALE*…]
 
 # DESCRIPTION
 
 This tool generates locale files for the locales that might be necessary
-for Steam games. It should be invoked with the current working directory
-set to an empty directory.
+for Steam games. It should be invoked with the **--output-directory**
+(for which the default is the current working directory) set to an
+empty directory.
 
-If the current working directory is non-empty, the behaviour is undefined.
+If the output directory is non-empty, the behaviour is undefined.
 Existing subdirectories corresponding to locales might be overwritten, or
 might be kept. (The current implementation is that they are kept, even if
 they are outdated or invalid.)
 
 # OPTIONS
 
+**--output-directory** *DIR*, **--output-dir** *DIR*, **-o** *DIR*
+:   Output to *DIR* instead of the current working directory.
+
 **--verbose**
 :   Be more verbose.
 
@@ -42,10 +48,11 @@ they are outdated or invalid.)
 
 The diagnostic output on standard error is not machine-readable.
 
-Locale files are generated in the current working directory. On exit,
-if the current working directory is non-empty (exit status 72 or 73),
+Locale files are generated in the **--output-directory**, or the current
+working directory if not specified. On exit,
+if the output directory is non-empty (exit status 72 or 73),
 its path should be added to the **LOCPATH** environment variable. If
-the current working directory is empty (exit status 0),
+the output directory is empty (exit status 0),
 **LOCPATH** should not be modified.
 
 # EXIT STATUS
@@ -59,12 +66,11 @@ the current working directory is empty (exit status 0),
 
 72 (**EX_OSFILE**)
 :   Not all of the necessary locales were already available, but all
-    were generated in the current working directory.
+    were generated in the output directory.
 
 73 (**EX_CANTCREAT**)
 :   At least one locale was not generated successfully. Some other
-    locales might have been generated in the current working directory
-    as usual.
+    locales might have been generated in the output directory as usual.
 
 78 (**EX_CONFIG**)
 :   One of the locales given was invalid or could lead to path traversal.
@@ -76,7 +82,7 @@ Anything else
 # EXAMPLE
 
     $ mkdir locales
-    $ ( cd locales; pressure-vessel-locale-gen )
+    $ pressure-vessel-locale-gen --output-directory=locales
     $ if [ $? = 0 ]; then \
       ./bin/some-game; \
     else \
diff --git a/man/meson.build b/man/meson.build
index 0c19932021196115a8818f69bab9f551590893c9..22fa8b32da0d9430e24bc4828f63bc59570dbf64 100644
--- a/man/meson.build
+++ b/man/meson.build
@@ -33,7 +33,16 @@ else
   pandoc_markdown_nosmart = 'markdown'
 endif
 
-foreach tool : ['launch', 'launcher', 'locale-gen', 'try-setlocale']
+foreach tool : [
+  'adverb',
+  'launch',
+  'launcher',
+  'locale-gen',
+  'test-ui',
+  'try-setlocale',
+  'unruntime',
+  'wrap',
+]
   custom_target(
     tool + '.1',
     build_by_default : true,
diff --git a/man/test-ui.1.md b/man/test-ui.1.md
new file mode 100644
index 0000000000000000000000000000000000000000..c9a9881c39ca49956967e4501c60e85bed7759ff
--- /dev/null
+++ b/man/test-ui.1.md
@@ -0,0 +1,51 @@
+---
+title: pressure-vessel-test-ui
+section: 1
+...
+
+# NAME
+
+pressure-vessel-test-ui - testing/development UI for pressure-vessel
+
+# SYNOPSIS
+
+**pressure-vessel-test-ui**
+[*OPTIONS*]
+[**--**]
+*COMMAND* [*ARGUMENTS...*]
+
+# DESCRIPTION
+
+**pressure-vessel-test-ui** runs **pressure-vessel-wrap** with an
+interactive GUI to modify settings.
+
+# OPTIONS
+
+All options are passed directly to **pressure-vessel-wrap**(1), and
+override anything that is chosen in the GUI. For best results, don't
+use any options.
+
+# ENVIRONMENT
+
+Various environment variables understood by **pressure-vessel-wrap**
+are used to set default values for the GUI.
+
+# DEPENDENCIES
+
+**pressure-vessel-test-ui** requires Python 3.4 or later, a modern
+version of PyGObject (PyGI, for example the `python3-gi` package in
+Debian and Ubuntu), and GObject-Introspection data for GLib and GTK 3.
+
+# EXIT STATUS
+
+The same as **pressure-vessel-wrap**, or nonzero for an internal error
+in **pressure-vessel-test-ui**.
+
+# EXAMPLE
+
+Run Steam with `PRESSURE_VESSEL_WRAP_GUI=1` in the environment.
+Install the Steam Linux Runtime (`steam://install/1070560`), configure
+a native Linux game in Steam to be run with the `Steam Linux Runtime`
+"compatibility tool", and launch it.
+
+<!-- vim:set sw=4 sts=4 et: -->
diff --git a/man/unruntime.1.md b/man/unruntime.1.md
new file mode 100644
index 0000000000000000000000000000000000000000..bccb3452c4e19a7df6a35814f833946834d275e8
--- /dev/null
+++ b/man/unruntime.1.md
@@ -0,0 +1,109 @@
+---
+title: pressure-vessel-unruntime
+section: 1
+...
+
+# NAME
+
+pressure-vessel-unruntime - run Steam games in a bubblewrap container
+
+# SYNOPSIS
+
+**pressure-vessel-unruntime**
+[*OPTIONS*]
+[**--**]
+*COMMAND* [*ARGUMENTS...*]
+
+# DESCRIPTION
+
+**pressure-vessel-unruntime** escapes from the Steam Runtime to run
+**pressure-vessel-wrap** with its own bundled libraries.
+
+# OPTIONS
+
+All options are passed directly to **pressure-vessel-wrap**(1).
+One option is special:
+
+`--batch`
+:   If present, the test-UI will not be run.
+
+# ENVIRONMENT
+
+`LD_LIBRARY_PATH`
+:   Unset, and passed to **pressure-vessel-wrap** via the
+    `--env-if-host` option so that it will be reinstated if the game
+    is run with the host `/usr`.
+
+`LD_PRELOAD`
+:   Unset, and passed to **pressure-vessel-wrap** via the
+    `--env-if-host` option so that it will be reinstated if the game
+    is run with the host `/usr`. Individual items are also passed to
+    **pressure-vessel-wrap** via the **--host-ld-preload** option,
+    so that `LD_PRELOAD` modules can be made available read-only
+    in the container.
+
+`PATH`
+:   Reset to a sensible default, and passed to **pressure-vessel-wrap**
+    via the `--env-if-host` option so that it will be reinstated if the
+    game is run with the host `/usr`.
+
+`PRESSURE_VESSEL_BATCH`
+:   If set to 1, it is equivalent to `--batch`.
+
+`PRESSURE_VESSEL_WRAP_GUI`
+:   If set, and `--batch` is not active, run the
+    **pressure-vessel-test-ui** testing/development user
+    interface instead of running **pressure-vessel-wrap** immediately.
+
+`STEAM_RUNTIME`
+:   Unset.
+
+`SYSTEM_LD_LIBRARY_PATH`
+:   Used to reset `LD_LIBRARY_PATH` to the value it had on entry to Steam.
+
+`SYSTEM_LD_PRELOAD`
+:   Used to reset `LD_PRELOAD` to the value it had on entry to Steam.
+
+`SYSTEM_PATH`
+:   Used to reset `PATH` to the value it had on entry to Steam.
+
+# SIGNALS
+
+The **pressure-vessel-unruntime** process replaces itself with
+**pressure-vessel-test-ui** or **pressure-vessel-wrap**, so signal
+handling is the same as for those programs.
+
+# EXIT STATUS
+
+The same as **pressure-vessel-wrap**, or nonzero for an internal error
+in **pressure-vessel-unruntime**.
+
+# EXAMPLE
+
+    $ steam steam://install/1070560     # Steam Linux Runtime 'scout'
+    $ steam steam://install/302380      # Floating Point, a small free game
+    $ rm -fr ~/tmp/scout
+    $ mkdir -p ~/tmp/scout
+    $ tar \
+        -C ~/tmp/scout \
+        -xzvf ~/.steam/steamapps/common/SteamLinuxRuntime/com.valvesoftware.SteamRuntime.Platform-amd64,i386-scout-runtime.tar.gz
+
+In Steam, disable all Steam compatibility tools for Floating Point, and
+set its launch options to:
+
+    /path/to/pressure-vessel/bin/pressure-vessel-unruntime \
+        --runtime ~/tmp/scout/files \
+        --shell=instead \
+        -- \
+        %command%
+
+Launching it will launch an `xterm` instead.
+In the resulting `xterm`(1), you can explore the container interactively,
+then type `"$@"` to run the game itself.
+
+For more joined-up integration with Steam, install the Steam Linux Runtime
+(`steam://install/1070560`), configure a native Linux game in Steam
+to be run with the `Steam Linux Runtime` "compatibility tool", and
+reset the launch options to be empty.
+
+<!-- vim:set sw=4 sts=4 et: -->
diff --git a/man/wrap.1.md b/man/wrap.1.md
new file mode 100644
index 0000000000000000000000000000000000000000..29ffe762402f8f1f3ab0575a3627fe30f4fbde1d
--- /dev/null
+++ b/man/wrap.1.md
@@ -0,0 +1,437 @@
+---
+title: pressure-vessel-wrap
+section: 1
+...
+
+# NAME
+
+pressure-vessel-wrap - run programs in a bubblewrap container
+
+# SYNOPSIS
+
+**pressure-vessel-wrap**
+[*OPTIONS*]
+[**--**]
+*COMMAND* [*ARGUMENTS...*]
+
+**pressure-vessel-wrap --test**
+
+**pressure-vessel-wrap --version**
+
+# DESCRIPTION
+
+**pressure-vessel-wrap** runs *COMMAND* in a container, using **bwrap**(1).
+
+# OPTIONS
+
+`--batch`
+:   Disable all interactivity and redirection: ignore `--shell`,
+    all `--shell-` options, `--terminal`, `--tty` and `--xterm`.
+
+`--copy-runtime-into` *DIR*
+:   If a `--runtime` is active, copy it into a subdirectory of *DIR*,
+    edit the copy in-place, and mount the copy read-only in the container,
+    instead of setting up elaborate bind-mount structures.
+
+`--env-if-host` *VAR=VAL*
+:   If *COMMAND* is run with `/usr` from the host system, set
+    environment variable *VAR* to *VAL*. If not, leave *VAR* unchanged.
+
+`--filesystem` *PATH*
+:   Share *PATH* from the host system with the container.
+
+`--freedesktop-app-id` *ID*
+:   If using `--unshare-home`, use *~/.var/app/ID* as the home
+    directory. This is the same home directory that a Flatpak app for
+    freedesktop.org app *ID* would use.
+
+`--gc-runtimes`, `--no-gc-runtimes`
+:   If using `--copy-runtime-into`, garbage-collect old temporary
+    runtimes that are left over from a previous **pressure-vessel-wrap**.
+    This is the default. `--no-gc-runtimes` disables this behaviour.
+
+`--generate-locales`, `--no-generate-locales`
+:   Passed to **pressure-vessel-wrap**(1).
+    The default is `--generate-locales`, overriding the default
+    behaviour of **pressure-vessel-wrap**(1).
+
+`--home` *DIR*
+:   Use *DIR* as the home directory. This implies `--unshare-home`.
+
+`--host-fallback`
+:   If **bwrap**(1) cannot be run, attempt to run *COMMAND* in the
+    current execution environment using the `LD_LIBRARY_PATH`
+    Steam Runtime instead. In practice this will only work for
+    Steam Runtime version 1, "scout".
+
+`--host-ld-preload` *MODULE*
+:   Add *MODULE* from the host system to `LD_PRELOAD` when executing
+    *COMMAND*. If *COMMAND* is run in a container, the path of the
+    *MODULE* will be adjusted appropriately.
+
+`--keep-game-overlay`, `--remove-game-overlay`
+:   If `--remove-game-overlay` is specified, remove the Steam Overlay
+    from the `LD_PRELOAD`. The default is `--keep-game-overlay`.
+
+`--only-prepare`
+:   Prepare the runtime, but do not actually run *COMMAND*.
+    With `--copy-runtime-into`, the prepared runtime will appear in
+    a subdirectory of *DIR*.
+
+`--runtime=`
+:   Use the current execution environment's /usr to provide /usr in
+    the container.
+
+`--runtime` *PATH*
+:   Use *PATH* to provide /usr in the container.
+    If *PATH*/usr exists, *PATH* is assumed to be a complete sysroot
+    (containing bin/sh, usr/bin/env and many other OS files).
+    Otherwise, *PATH* is assumed to be a merged-/usr environment
+    (containing bin/sh, bin/env and many other OS files).
+    For example, the `files` subdirectory of a Flatpak runtime is a
+    suitable value for *PATH*.
+
+`--runtime-base` *PATH*
+:   If `--runtime` specifies a relative path, look for it relative
+    to *PATH*.
+
+`--share-home`, `--unshare-home`
+:   If `--unshare-home` is specified, use the home directory given
+    by `--home`, `--freedesktop-app-id`, `--steam-app-id` or their
+    corresponding environment variables, at least one of which must be
+    provided.
+
+    If `--share-home` is specified, use the home directory from the
+    current execution environment.
+
+    The default is `--share-home`, unless `--home` or its
+    corresponding environment variable is used.
+
+`--share-pid`, `--unshare-pid`
+:   If `--unshare-pid` is specified, create a new process ID namespace.
+    Note that this is known to interfere with IPC between Steam and its
+    games. The default is `--share-pid`.
+
+`--shell=none`
+:   Don't run an interactive shell. This is the default.
+
+`--shell=after`, `--shell-after`
+:   Run an interactive shell in the container after *COMMAND* exits.
+    In that shell, running `"$@"` will re-run *COMMAND*.
+
+`--shell=fail`, `--shell-fail`
+:   The same as `--shell=after`, but do not run the shell if *COMMAND*
+    exits with status 0.
+
+`--shell=instead`, `--shell-instead`
+:   The same as `--shell=after`, but do not run *COMMAND* at all.
+
+`--steam-app-id` *N*
+:   Assume that we are running Steam app ID *N*, specified as an integer.
+    If using `--unshare-home`, use *~/.var/app/com.steampowered.AppN*
+    as the home directory.
+
+`--terminal=none`
+:   Disable features that would ordinarily use a terminal.
+
+`--terminal=auto`
+:   Equivalent to `--terminal=xterm` if a `--shell` option other
+    than `none` is used, or `--terminal=none` otherwise.
+
+`--terminal=tty`, `--tty`
+:   Use the current execution environment's controlling tty for
+    the `--shell` options.
+
+`--terminal=xterm`, `--xterm`
+:   Start an `xterm`(1) inside the container.
+
+`--terminate-timeout` *SECONDS*, `--terminate-idle-timeout` *SECONDS*
+:   Passed to **pressure-vessel-wrap**(1).
+
+`--test`
+:   Perform a smoke-test to determine whether **pressure-vessel-wrap**
+    can work, and exit. Exit with status 0 if it can or 1 if it cannot.
+
+`--verbose`
+:   Be more verbose.
+
+`--version`
+:   Print the version number and exit.
+
+`--with-host-graphics`, `--without-host-graphics`
+:   If using a `--runtime`, either import the host system's
+    graphics stack into it (default), or use the runtime's graphics
+    stack if any (likely to result in slow rendering or a crash).
+
+# ENVIRONMENT
+
+The following environment variables (among others) are read by
+**pressure-vessel-wrap**(1).
+
+`__EGL_VENDOR_LIBRARY_DIRS`, `__EGL_VENDOR_LIBRARY_FILENAMES`
+:   Used to locate EGL ICDs to be made available in the container
+    if `--runtime` and `--with-host-graphics` are active.
+
+`BWRAP` (path)
+:   Absolute path to **bwrap**(1).
+    The default is to try several likely locations.
+
+`DBUS_SESSION_BUS_ADDRESS`, `DBUS_SYSTEM_BUS_ADDRESS`
+:   Used to locate the well-known D-Bus session and system buses
+    so that they can be made available in the container.
+
+`DISPLAY`
+:   Used to locate the X11 display to make available in the container.
+
+`LIBGL_DRIVERS_PATH`
+:   Used to locate Mesa DRI drivers to be made available in the container
+    if `--runtime` and `--with-host-graphics` are active.
+
+`LIBVA_DRIVERS_PATH`
+:   Used to locate VA-API drivers to be made available in the container
+    if `--runtime` and `--with-host-graphics` are active.
+
+`PRESSURE_VESSEL_BATCH` (boolean)
+:   If set to `1`, equivalent to `--batch`.
+    If set to `0`, no effect.
+
+`PRESSURE_VESSEL_COPY_RUNTIME_INTO` (path or empty string)
+:   Equivalent to
+    `--copy-runtime-into="$PRESSURE_VESSEL_COPY_RUNTIME_INTO"`.
+
+`PRESSURE_VESSEL_FDO_APP_ID` (string)
+:   Equivalent to
+    `--freedesktop-app-id="$PRESSURE_VESSEL_FDO_APP_ID"`.
+
+`PRESSURE_VESSEL_GC_RUNTIMES` (boolean)
+:   If set to `1`, equivalent to `--gc-runtimes`.
+    If set to `0`, equivalent to `--no-gc-runtimes`.
+
+`PRESSURE_VESSEL_GENERATE_LOCALES` (boolean)
+:   If set to `1`, equivalent to `--generate-locales`.
+    If set to `0`, equivalent to `--no-generate-locales`.
+
+`PRESSURE_VESSEL_HOME` (path)
+:   Equivalent to `--home="$PRESSURE_VESSEL_HOME"`.
+
+`PRESSURE_VESSEL_HOST_GRAPHICS` (boolean)
+:   If set to `1`, equivalent to `--with-host-graphics`.
+    If set to `0`, equivalent to `--without-host-graphics`.
+
+`PRESSURE_VESSEL_REMOVE_GAME_OVERLAY` (boolean)
+:   If set to `1`, equivalent to `--remove-game-overlay`.
+    If set to `0`, equivalent to `--keep-game-overlay`.
+
+`PRESSURE_VESSEL_RUNTIME` (path, filename or empty string)
+:   Equivalent to `--runtime="$PRESSURE_VESSEL_RUNTIME"`.
+
+`PRESSURE_VESSEL_RUNTIME_BASE` (path, filename or empty string)
+:   Equivalent to `--runtime-base="$PRESSURE_VESSEL_RUNTIME_BASE"`.
+
+`PRESSURE_VESSEL_SHARE_HOME` (boolean)
+:   If set to `1`, equivalent to `--share-home`.
+    If set to `0`, equivalent to `--unshare-home`.
+
+`PRESSURE_VESSEL_SHARE_PID` (boolean)
+:   If set to `1`, equivalent to `--share-pid`.
+    If set to `0`, equivalent to `--unshare-pid`.
+
+`PRESSURE_VESSEL_SHELL` (`none`, `after`, `fail` or `instead`)
+:   Equivalent to `--shell="$PRESSURE_VESSEL_SHELL"`.
+
+`PRESSURE_VESSEL_TERMINAL` (`none`, `auto`, `tty` or `xterm`)
+:   Equivalent to `--terminal="$PRESSURE_VESSEL_TERMINAL"`.
+
+`PRESSURE_VESSEL_VERBOSE` (boolean)
+:   If set to `1`, equivalent to `--verbose`.
+
+`PULSE_CLIENTCONFIG`
+:   Used to locate PulseAudio client configuration.
+
+`PULSE_SERVER`
+:   Used to locate a PulseAudio server.
+
+`STEAM_COMPAT_APP_ID` (integer)
+:   Equivalent to `--steam-app-id="$STEAM_COMPAT_APP_ID"`.
+    (Not used yet, but should be.)
+
+`STEAM_COMPAT_APP_LIBRARY_PATH` (path)
+:   (Not used yet, but should be.)
+
+`STEAM_COMPAT_APP_LIBRARY_PATHS` (path)
+:   (Not used yet, but should be?)
+
+`STEAM_COMPAT_CLIENT_INSTALL_PATH` (path)
+:   When used as a Steam compatibility tool, the absolute path to the
+    Steam client installation directory.
+    This is made available read/write in the container.
+
+`STEAM_COMPAT_DATA_PATH` (path)
+:   When used as a Steam compatibility tool, the absolute path to the
+    variable data directory used by Proton, if any.
+    This is made available read/write in the container.
+
+`STEAM_COMPAT_SESSION_ID` (integer)
+:   (Not used yet, but should be.)
+
+`STEAM_COMPAT_TOOL_PATHS` (`:`-separated list of paths)
+:   (Not used yet, but should be.)
+
+`STEAM_RUNTIME` (path)
+:   **pressure-vessel-wrap** refuses to run if this environment variable
+    is set. Use `pressure-vessel-unruntime`(1) instead.
+
+`SteamAppId` (integer)
+:   Equivalent to `--steam-app-id="$SteamAppId"`.
+    Must only be set for the main processes that are running a game, not
+    for any setup/installation steps that happen first.
+
+`VDPAU_DRIVER_PATH`
+:   Used to locate VDPAU drivers to be made available in the container
+    if `--runtime` and `--with-host-graphics` are active.
+
+`VK_ICD_FILENAMES`
+:   Used to locate Vulkan ICDs to be made available in the container
+    if `--runtime` and `--with-host-graphics` are active.
+
+`WAYLAND_DISPLAY`
+:   Used to locate the Wayland display to make available in the container.
+
+The following environment variables are set by **pressure-vessel-wrap**(1).
+
+`__EGL_VENDOR_LIBRARY_DIRS`
+:   Unset if `--runtime` and `--with-host-graphics` are active,
+    to make sure `__EGL_VENDOR_LIBRARY_FILENAMES` will be used instead.
+
+`__EGL_VENDOR_LIBRARY_FILENAMES`
+:   Set to a search path for EGL ICDs
+    if `--runtime` and `--with-host-graphics` are active.
+
+`DBUS_SESSION_BUS_ADDRESS`, `DBUS_SYSTEM_BUS_ADDRESS`
+:   Set to paths in the container's private `/run` where the well-known
+    D-Bus session and system buses are made available.
+
+`DISPLAY`
+:   Set to a value corresponding to the socket in the container's
+    `/tmp/.X11-unix`.
+
+`LD_LIBRARY_PATH`
+:   Set to a search path for shared libraries if `--runtime` is active.
+
+`LD_PRELOAD`
+:   Set according to `--host-ld-preload`, `--keep-game-overlay`,
+    `--remove-game-overlay`.
+
+`LIBGL_DRIVERS_PATH`
+:   Set to a search path for Mesa DRI drivers
+    if `--runtime` and `--with-host-graphics` are active.
+
+`LIBVA_DRIVERS_PATH`
+:   Set to a search path for VA-API drivers
+    if `--runtime` and `--with-host-graphics` are active.
+
+`PATH`
+:   Reset to a reasonable value if `--runtime` is active.
+
+`PULSE_CLIENTCONFIG`
+:   Set to the address of a PulseAudio client configuration file.
+
+`PULSE_SERVER`
+:   Set to the address of a PulseAudio server socket.
+
+`VDPAU_DRIVER_PATH`
+:   Set to a search path for VDPAU drivers
+    if `--runtime` and `--with-host-graphics` are active.
+
+`VK_ICD_FILENAMES`
+:   Set to a search path for Vulkan ICDs
+    if `--runtime` and `--with-host-graphics` are active.
+
+`XAUTHORITY`
+:   Set to a value corresponding to a file in the container's
+    private `/run`.
+
+`XDG_CACHE_HOME`
+:   Set to `$HOME/.cache` (in the private home directory)
+    if `--unshare-home` is active.
+
+`XDG_CONFIG_HOME`
+:   Set to `$HOME/.config` (in the private home directory)
+    if `--unshare-home` is active.
+
+`XDG_DATA_HOME`
+:   Set to `$HOME/.local/share` (in the private home directory)
+    if `--unshare-home` is active.
+
+`XDG_RUNTIME_DIR`
+:   Set to a new directory in the container's private `/run`
+    if `--runtime` is active.
+
+# OUTPUT
+
+The standard output from *COMMAND* is printed on standard output.
+
+The standard error from *COMMAND* is printed on standard error.
+Diagnostic messages from **pressure-vessel-wrap** and
+**pressure-vessel-wrap** may also be printed on standard error.
+
+# SIGNALS
+
+The **pressure-vessel-wrap** process replaces itself with a **bwrap**(1)
+process. Fatal signals to the resulting **bwrap**(1) process will result
+in `SIGTERM` being received by the **pressure-vessel-wrap** process
+that runs *COMMAND* inside the container.
+
+# EXIT STATUS
+
+Nonzero (failure) exit statuses are subject to change, and might be
+changed to be more like **env**(1) in future.
+
+0
+:   The *COMMAND* exited successfully with status 0
+
+Assorted nonzero statuses
+:   An error occurred while setting up the execution environment or
+    starting the *COMMAND*
+
+Any value 1-255
+:   The *COMMAND* exited unsuccessfully with the status indicated
+
+128 + *n*
+:   The *COMMAND* was killed by signal *n*
+    (this is the same encoding used by **bash**(1), **bwrap**(1) and
+    **env**(1))
+
+255
+:   The *COMMAND* terminated in an unknown way (neither a normal exit
+    nor terminated by a signal).
+
+# EXAMPLE
+
+In this example we install and run a small free game that does not
+require communication or integration with Steam, without going via
+Steam to launch it. This will only work for simple games without DRM
+or significant Steam integration.
+
+    $ steam steam://install/1070560     # Steam Linux Runtime 'scout'
+    $ steam steam://install/302380      # Floating Point, a small free game
+    $ rm -fr ~/tmp/scout
+    $ mkdir -p ~/tmp/scout
+    $ tar \
+        -C ~/tmp/scout \
+        -xzvf ~/.steam/steamapps/common/SteamLinuxRuntime/com.valvesoftware.SteamRuntime.Platform-amd64,i386-scout-runtime.tar.gz
+    $ cd ~/.steam/steam/steamapps/common/"Floating Point"
+    $ /path/to/pressure-vessel/bin/pressure-vessel-wrap \
+        --runtime ~/tmp/scout/files \
+        --shell=instead \
+        -- \
+        "./Floating Point.x86"
+
+In the resulting `xterm`(1), you can explore the container interactively,
+then type `"$@"` to run the game itself.
+
+For more joined-up integration with Steam, install the Steam Linux Runtime
+(`steam://install/1070560`), and configure a native Linux game in Steam
+to be run with the `Steam Linux Runtime` "compatibility tool".
+
+<!-- vim:set sw=4 sts=4 et: -->
diff --git a/meson.build b/meson.build
index 808a289f048277024ed3f9488236a516fef92665..f416bf49db27138cdd4bf7c3ea0cad6f5863e8c7 100644
--- a/meson.build
+++ b/meson.build
@@ -185,8 +185,6 @@ scripts = [
   'pressure-vessel-locale-gen',
   'pressure-vessel-test-ui',
   'pressure-vessel-unruntime',
-  'pressure-vessel-unruntime-scout',
-  'pressure-vessel-unruntime-test-ui',
 ]
 
 foreach script : scripts
diff --git a/pressure-vessel-unruntime-scout b/pressure-vessel-unruntime-scout
deleted file mode 100755
index 5b95ca93f763ff98d63b67d035358d17f569a89f..0000000000000000000000000000000000000000
--- a/pressure-vessel-unruntime-scout
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-# pressure-vessel-scout — undo the Steam Runtime's environment and use
-# scout, assuming the layout of the SteamLinuxRuntime depot.
-#
-# Copyright © 2019 Collabora Ltd.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-set -eu
-
-me="$(readlink -f "$0")"
-here="${me%/*}"
-me="${me##*/}"
-
-export PRESSURE_VESSEL_RUNTIME_BASE="${here}/../.."
-export PRESSURE_VESSEL_RUNTIME="scout/files"
-exec "$here/pressure-vessel-unruntime" "$@"
-
-# vim:set sw=4 sts=4 et:
diff --git a/pressure-vessel-unruntime-test-ui b/pressure-vessel-unruntime-test-ui
deleted file mode 100755
index 4458d2c1639ccf3985a1e27997fa18ea9ce3133f..0000000000000000000000000000000000000000
--- a/pressure-vessel-unruntime-test-ui
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-# pressure-vessel-unruntime — undo the Steam Runtime's environment
-#
-# Copyright © 2017-2019 Collabora Ltd.
-#
-# SPDX-License-Identifier: MIT
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-set -e
-set -o pipefail
-set -u
-shopt -s nullglob
-
-me="$(readlink -f "$0")"
-here="${me%/*}"
-me="${me##*/}"
-
-export PRESSURE_VESSEL_WRAP_GUI=yes
-exec "$here/pressure-vessel-unruntime" "$@"
-
-# vim:set sw=4 sts=4 et:
diff --git a/src/wrap.c b/src/wrap.c
index d5a201dd9835a697379fcfae4ea65e3fdd5abe31..69a9dff51ecb0e0f0628c6ce984fc279cb38a9ac 100644
--- a/src/wrap.c
+++ b/src/wrap.c
@@ -678,7 +678,7 @@ static GOptionEntry options[] =
   { "terminate-idle-timeout", '\0',
     G_OPTION_FLAG_NONE, G_OPTION_ARG_DOUBLE, &opt_terminate_idle_timeout,
     "If --terminate-timeout is used, wait this many seconds before "
-    "sending SIGTERM. [default: 0.0]"
+    "sending SIGTERM. [default: 0.0]",
     "SECONDS" },
   { "terminate-timeout", '\0',
     G_OPTION_FLAG_NONE, G_OPTION_ARG_DOUBLE, &opt_terminate_timeout,
diff --git a/tests/shellcheck.sh b/tests/shellcheck.sh
index f952e51278e76623bb1e09865192c167d4fcec8e..6d3866008c853d2b4d410c5aa7d376a7e27b4003 100755
--- a/tests/shellcheck.sh
+++ b/tests/shellcheck.sh
@@ -36,8 +36,6 @@ cd "$G_TEST_SRCDIR/.."
 n=0
 for shell_script in \
         ./pressure-vessel-unruntime \
-        ./pressure-vessel-unruntime-scout \
-        ./pressure-vessel-unruntime-test-ui \
         ./pressure-vessel-locale-gen \
         ./tests/*.sh \
         ; do